【问题标题】:link_to in Rails 3.1Rails 3.1 中的 link_to
【发布时间】:2011-10-15 20:14:48
【问题描述】:

我正在将应用程序从 rails 2 转换为 rails 3,有人可以帮我解决这个小代码。 link_to 不起作用,有人可以指出我如何正确使用 link_to 而不是 rails 3.1 中的 link_to_remote 吗? Rails 2 代码

<%= link_to_remote  package_item.getId(),
                    :url => { :controller => 'cmn/popup',
                              :action     => "show_popup",
                              :frame_url  =>  admin_url( 
                                                :ctrl   => controller,
                                                :app_action => 'package.item.edit',
                                                :id     => package_item.getId().to_s,
                                                :remote => true
                                              ),
                              :frame_width  => '570px',
                              :frame_height => '355px'
                            }
%>

Rails 3.1 代码

<%= link_to package_item.getId(),
            :url => { :controller => 'cmn/popup',
                      :action     => "show_popup",
                      :frame_url  =>  admin_url( 
                                        :ctrl => controller,
                                        :app_action => 'package.item.edit',
                                        :id   => package_item.getId().to_s
                                      ),
                      :frame_width  => '570px',
                      :frame_height => '355px',
                      :remote       => true
                    }
%>

我将所有.rjs 文件替换为.js.erb。这是我在 Rails 3 中获得的 URL:

<a href="/common/login/en/sentry?url%5Baction%5D=show_popup&amp;url%5Bcontroller%5D=cmn%2Fpopup&amp;url%5Bframe_height%5D=355px&amp;url%5Bframe_url%5D=%2Fcommon%2Flogin%2Fen%2Fsentry%3Fapp_action%3Dpackage.item.edit%26id%3D3%26remote%3Dtrue&amp;url%5Bframe_width%5D=570px&amp;url%5Bremote%5D=true">3</a>

这是在 Rails 2 中:

<a href="#" onclick="new Ajax.Request('/cmn/popup/show_popup?frame_height=355px&amp;frame_url=%2Fcmn%2Fcmn%2Findex%2F2%3Fapp_action%3Dpackage.item.edit%26amp%3Bbrand%3Dsentry%26amp%3Blanguage%3Den&amp;frame_width=570px', {asynchronous:true, evalScripts:true}); return false;">2</a>

我的控制器

    def show_popup
      @content_data = {}
      @content_data.merge!(params)
      render(:template => 'cmn/popup/show_popup', :nolayout => 1)
  end

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-3.1 link-to rails-3-upgrade


    【解决方案1】:

    请查看 Rails 3 中 link_to 的语法: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

    您的所有参数都在 :url 哈希中,但您不需要将其命名为 :url,只需将选项传入哈希中,如下所示:

    <%= link_to package_item.getId(),
            { 
                      :controller => 'cmn/popup',
                      :action     => "show_popup",
                      :frame_url  =>  admin_url( 
                                        :ctrl => controller,
                                        :app_action => 'package.item.edit',
                                        :id   => package_item.getId().to_s
                                      ),
                      :frame_width  => '570px',
                      :frame_height => '355px'
            },
            :remote       => true
    %>
    

    记得从 url 哈希中取出 :remote

    让我知道这是否有效。

    【讨论】:

    • Cristian 这真的很有帮助,我真的很感激,但我仍然遇到一些错误,例如 Template cmn/popup/show_popup 不存在。这是我的控制器 def show_popup @content_data = {} @content_data.merge!(params) render(:template => 'cmn/popup/show_popup', :nolayout => 1) end 我把 show_popup.js.erb 放进去位置
    【解决方案2】:

    这是我第一次看到将路径定义为 :controller 参数的字符串。

    我的意思是 de :controller => 'cmn/popup'。这对我来说是新的,感觉很奇怪。

    您确定这可行并且正确的控制器和操作正在接收请求吗?

    我认为可能会比较棘手的另一件事是控制器上的渲染调用。只需拨打电话

    render :layout => false
    

    或者根本不调用任何东西。

    如果模板与动作同名,并且它被放置在一个名为控制器的目录中,rails 会根据请求类型知道需要呈现什么模板和扩展名(js/html/xml)。也许 render :template => .... 强制渲染一个 html 模板。

    我认为 :nolayout 选项无效。无论如何,如果请求是针对 javascript 文件的,它永远不会呈现布局。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多