开发者

Identical Files behave differently due to link with controller

开发者 https://www.devze.com 2023-02-04 05:48 出处:网络
I am building my first app with ROR and stumbled upon a couple of problems due to my understanding of the MVC

I am building my first app with ROR and stumbled upon a couple of problems due to my understanding of the MVC

I have a page to add a new item, and this works fine, rails magically hooks it up to the items controller and somehow by magic it knows to look in the method 'new' as the page is called new.

But this layer is confusing me, as i need to now create a different version of new, same functionality but with a different look so to use a diffe开发者_开发技巧rent layout to application.html.erb

So i attempt to create a copy of new.html.erb and create bookmarklet.html.erb - both contain exactly the same code: a link to a form. but of course bookmarklet will error on me because it does not have that link in the controller - how do i 'wire' up bookmarklet so that i can call the new method and so that it can behave in a similar way to the identical new.html.erb

Also, how can i tell the new bookmarklet.html.erb to ignore the application.html.erb and get its layout from another file?

thanks in advance


The magic happens in the routes. Rails uses something called RESTful routes, which is taking HTTP verbs and assigning standard actions to it. the new action is a GET request in HTTP speak, and if you are using scaffolding or following REST, will have the ruby call to build a new object in the controller, as an instance variable so you can use it in your view.

You have to tell rails routes that you want to BREAK this arrangement and to let /items/bookmarklet be used in the controller.

In your routes.rb file replace resources :items with

resources items do
  member do
    get 'bookmarklet'
  end
end

In your controller put:

def bookmarklet
  @item = Item.new
  render :template => "bookmarklet", :layout => "different_layout" # or you can put this on the top of the controller, which is my style, but whatevs.
end

You should look into partials, if you are doing this as they clean up your code immensely.


A better way to think of things is to start with the controller instead of the view html.erb files. So each public method in your controller is effectively a page or action in the site. When you need a new action or page, add the method to the controller first. Then create the relevant view files.

So in your controller you'll need something like:

def bookmarklet
  @item = Item.new(params[:item])
  @item.save
  render :template => "items/bookmarklet.html.erb", :layout => "different_layout.html.erb"
end

Normally you don't need to call render manually in the controller, but since you want a different layout than the default you need to specify it using render.

0

精彩评论

暂无评论...
验证码 换一张
取 消