【问题标题】:Calling custom action without re-rendering page with Rails link_to使用 Rails link_to 调用自定义操作而不重新渲染页面
【发布时间】:2013-10-12 17:58:02
【问题描述】:

在 _follow.html.slim 中,我试图用这个链接“添加朋友”:

= link_to "Add Friend",  :controller => "relationships", :action => "req"

我希望它在保持在同一页面上的同时调用关系控制器中的方法 req。它目前甚至没有调用该方法并返回此错误: 没有路线匹配 {:controller=>"relationships", :action=>"req", :name=>"Nathan Glass", :age=>"21"}

我正在关注本教程http://francik.name/rails2010/week10.html,但他没有为此操作定义路线。如果这个错误是正确的,我想我的困惑就是为什么我需要一个路线。否则,我的问题是什么?谢谢!

class RelationshipsController < ApplicationController
def req
    puts "req called"*10
    # is setting @current_user since the current_user method already returns @current_user?
    @current_user = current_user
    @friend = User.find_by_name(params[:name])
    unless @friend.nil?
        if Relationship.request(@current_user, @friend)
          flash[:notice] = "Friendship with #{@friend.name} requested"
        else
            flash[:error] = "Friendship with #{@friend.name} cannot be requested"
        end
    end
  # render somewhere
end

结束

【问题讨论】:

    标签: ruby-on-rails routes custom-action link-to


    【解决方案1】:

    首先,您始终需要为操作定义路线。如果您不这样做,rails 将不知道您的操作存在(即使您在 link_to 中指定了控制器和操作名称)。

    为此,您只需在 config/routes.rb 文件中执行以下操作:

    get 'relationships/req'
    

    现在,您的 req 操作有一个路径,relationships_req_path(响应 HTTP GET 请求)。

    然后,如果您想在保持在同一页面上的同时调用控制器操作,您可以这样做:

    link_to "Add as friend", relationships_req_path, remote: true
    

    remote: true 修改链接行为(它将像 ajax 调用一样工作)并默认呈现关系/req.js.erb 文件(不能包含任何内容)。该文件允许用于在当前页面上动态添加/修改内容。

    【讨论】:

    • 谢谢!因此,如果我要在单击“添加朋友”时更改页面,我应该创建一个关系/req.js.erb 文件,并且它会自动绑定到单击该链接?否则 id 必须使用当前页面的 js 文件并为该链接创建事件处理程序?那正确吗?感谢西蒙的帮助。
    • 当你添加remote: true到你的链接时,这会调用你的控制器动作,执行它的代码然后渲染一个js文件(这里是relationships/req.js.erb)。因此,例如,您可以通过将这一行添加到js文件中来动态地将新朋友名称添加到您的页面:$('body').append("&lt;%= @friend.name %&gt;")
    • 好的,我必须手动制作文件,对吗?这个文件去哪里了?
    • 是的。这个文件是一个视图。所以,它位于 app/views/relationships/req.js.erb
    • 抱歉所有问题...我在那个位置创建了那个文件夹并尝试了 $(function() { alert("hello"); });当我点击那个链接时什么也没有发生..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2012-02-11
    • 2019-07-19
    • 2018-06-26
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多