form_for和scopes,rails 3

时间:2010-09-18 14:03:45

标签: scope ruby-on-rails-3 form-for

由于示波器和rails 3中的form_for帮助器,我遇到了问题。 路径 - 文件如下所示:

scope "(/:tab)" do
  resources :article
end

表单看起来像这样:

<%= form_for(@article) %>
   <%= f.label :title %>
   <%= f.text_field :title %>
    etc.
<%end%>

tab - 属性以字符串形式存储在params [:tab]中 我的问题是,这会在表单中生成错误的URL。我怎么能让这个工作? 生成的url article_path(params [:tab],@ article)完全正常

7 个答案:

答案 0 :(得分:11)

我想出的答案非常难看,但同时适用于更新和创建:

<%= form_for(@article, :url => (@article.new_record? ? 
    articles_path(params[:tab]) : article_path(params[:tab], @article) do |f| %>

更新: 更好的解决方案是将default_url_options方法覆盖为以下内容:

def default_url_options(options={})
  { :tab => params[:tab] }
end

然后&lt;%= form_for @article do | f | %GT;可以使用,并正确生成所有网址

答案 1 :(得分:10)

尝试:

<%= form_for [:tab, @article] do |f| %>
   <%= f.label :title %>
   <%= f.text_field :title %>
    etc.
<%end%>

答案 2 :(得分:1)

您可以明确指定路径:

<%= form_for(@article, :url => article_path(@article, :tab => params[:tab]) %>

答案 3 :(得分:0)

我发现这是一个非常恼人的问题,并且现在已经使用以下猴子补丁来解决这个问题了。像这样的通用,它是一个小小的出价,因为你只是将整个参数包传递给polymorphic_url,这是form_for在引擎盖下用来猜测路线。更简洁的方法是仅合并范围值。

我的解决方案:

https://gist.github.com/1848467

module ActionDispatch
  module Routing
    module PolymorphicRoutes
      def polymorphic_path(record_or_hash_or_array, options = {})
        begin
            polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path))
        rescue Exception => e
            polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path).merge(params.reject{|k,v| ["controller", "action"].include? k.to_s}))
        end
      end
    end
  end
end

答案 4 :(得分:0)

在非常类似的情况下,我在以下路线中定义了范围:

scope :path => ":election_id", :as => "election" do 
  resources :questions
end

现在我有election_questions_path(@election)

等助手

在我可以使用的表格中:

form_for [@election, @question] do |f|
  ...
end

在上面的例子中,@election是选举模型的一个实例。

将Friendly_id集成到此解决方案后,我得到了一些漂亮的网址。例如&#34; http://mydomain.com/elections-2012/questions/my-question"

答案 5 :(得分:0)

我对 form_for和scopes 的类似问题的解决方案是在helpers/<model_name>/<model_name>_helper.rb中定义新方法,例如我的是sessions_helper.rb,其中包含

module Implant::SessionsHelper
  def sessions_form_path(session)
    session.new_record? ? sessions_path : session_path(session)
  end
end

在我看来,我做了

form_for(@session, url: sessions_form_path(@session)) do |f|

有问题的routes.rb部分

scope module: 'implant' do
  resources :sessions
end

...要使用:tab param进行管理,您可以将其添加到帮助方法中。

答案 6 :(得分:0)

我不确定它能走多远,但是它可以在Rails 6上运行。我使用:

<%= form_for(@article, url: [@article, { tab: params[:tab] }]) %>
   <%= f.label :title %>
   <%= f.text_field :title %>
    etc.
<% end %>

这是有效的,因为数组URL生成语法。在new情况下,@article被检测为未持久,并路由到POST路由。在edit的情况下,@article被检测为已保留并路由到ID为PUT的路由。