Rails 3 Link_to :remote is not triggering RJS

时光总嘲笑我的痴心妄想 提交于 2019-12-11 03:35:21

问题


I'm working to setup an AJAX action in rails 3 with the following code. The AJAX part of the code seems to work, but it does not request the correct file and my respond_to serves it the regular HTML.

The routing information:

resources :zones do
  resources :records
end

controller:

def new
  @zone = Zone.new
  respond_to do |format|
    format.html
    format.js
  end
end

Link in view (haml):

= link_to 'Add a zone →', new_zone_path, :remote=>true

Generated HTML from link_to (also notice the failed rendering of the html entity...but thats another issue):

<a href="/zones/new" data-remote="true">Add a zone &amp;#8594;</a> 

For kicks, a directory listing of the view/zones. I'm not sure I am doing this quite right, so I have both new.js.rjs and new.rjs. They both have the same content, but are never picked up by the action.

|   `~zones/
|     |-_form.html.haml
|     |-_record.html.haml
|     |-edit.html.haml
|     |-index.html.haml
|     |-new.html.haml
|     |-new.js.rjs
|     |-new.rjs
|     `-show.html.haml

Lastly, the server log from when I click the link:

Started GET "/zones/new" for 127.0.0.1 at Wed Dec 29 00:04:03 -0700 2010
  Processing by ZonesController#new as */*
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
Rendered zones/_form.html.haml (22.1ms)
Rendered zones/new.html.haml within layouts/application (34.9ms)
Completed 200 OK in 80ms (Views: 42.0ms | ActiveRecord: 0.4ms)

As you can see, it is rendering the .html file for the request. Now, for testing, I hit the page http://localhost:3000/zones/new.js directly. And it serves up new.js.rjs. Also, the javascript remote call is working. Firebug shows the request and response, but its requesting the wrong page.

Also for testing I did this:

= link_to "Add a zone", '/zones/new.js', :remote=>true

Which works fine (rjs is downloaded and executed and works correctly) for the javascript but it doesn't have the nice failover for javascript-disabled systems.

For what it is worth I am using jquery.

I feel like I am missing something in the routing or the link syntax but all the examples I can find online and in the documentation seem to show exactly what I am doing. Whats the catch?

Thanks.


回答1:


You need to explicitly tell Rails that you want the js format:

= link_to 'Add a zone &#8594;', new_zone_path(:format => :js), :remote=>true

As a way of explanation: You have to specify the .js extension because Rails doesn't discriminate. In many cases, you might want to fetch html or json with Ajax--not just javascript. Rails will let you fetch whatever content in whatever format, which is why you have to specify it.




回答2:


This problem also can be solved with this syntax (includes data-type declaration)

= link_to 'Add a zone &#8594;', new_zone_path, remote: true, "data-type" => "script"

In case you just have .js.erb file , no .html file to render, it's not necessary to assign the data-type of request (Rails automatically detect that JS only way to response)

The main point here is you have to make sure that your request is considered to be executed as JS. It means your request in console should look like this:

Started ...
Processing by ABCController#method as JS


来源:https://stackoverflow.com/questions/4555267/rails-3-link-to-remote-is-not-triggering-rjs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!