开发者

add comparison feature in rails

i'm having a bit of trouble with adding a certain feature. i'm working on a buy/sell site and i want to be able to compare posts. here's what i have so far:

in the posts view:

<%= button_to "Add to Compare", :action => "addCompare" %>

开发者_StackOverflow中文版in the corresponding controller:

@@a = Array.new()

def addCompare
   @@a << Post.id
end

so, all i want to do is add the post's id to the array @@a. when i test this, i click on the "Add to Compare" button and I'm welcomed with this:

Template is missing

Missing template posts/addCompare with {:locale=>[:en, :en], :formats=>[:html], :handlers=>[:rxml, :rjs, :builder, :rhtml, :erb]} in view paths "/home/mja32/470repo/traders/app/views", "/var/lib/gems/1.8/gems/devise-1.4.2/app/views"

So I guess it's trying to redirect to a view. How do I prevent it from doing this? All I want this button to do is to add the post's id to the array and nothing more.

Thanks in advance,

Matt


First of all, storing persistent data in a controller's class variable isn't going to work the way you want it to. There's no guarantee that @@a will be the same array on your next addCompare call; for example, your next addCompare call could be handled by a different process. Also, what happens if two different clients call addCompare? Do you really want to mix their data together in one pile? Probably not. Your first task is to replace @@a with a real per-user persistent store.

If you want to return nothing at all from your controller, just do this at the end of your controller method:

render :nothing => true, :status => :ok

That will tell Rails that something has already been rendered so it doesn't need to try the default rendering action (which is to render the posts/addCompare view) and returns nothing more than a 200 status code to the client.

Once that's in place, you'll probably want to AJAXify your button with :remote => true:

:remote - If set to true, will allow the Unobtrusive JavaScript drivers to control the submit behaviour. By default this behaviour is an ajax submit.

So this:

<%= button_to "Add to Compare", { :action => "addCompare" }, { :remote => true } %>

Note that button_to looks like this:

button_to(name, options = {}, html_options = {})

and that :action is for options but :remote is for html_options so you have to explicitly set up the hashes with {}; you could just wrap the options in braces:

<%= button_to "Add to Compare", { :action => "addCompare" }, :remote => true %>

but I prefer the consistency of wrapping them both by hand.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜