7

Rails3のスコープとform_forヘルパーが原因で問題が発生しました。routes--ファイルは次のようになります。

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

フォームは次のようになります。

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

tab --属性は、文字列としてparams [:tab]に格納されます。私の問題は、これがフォームに間違ったURLを生成することです。どうすればこれを機能させることができますか?生成されたURLarticle_path(params [:tab]、@article)は完全に正常に機能します

4

7 に答える 7

12

私が思いついた答えはかなり醜いものでしたが、更新と作成の両方で機能します。

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

更新:より良い解決策は、default_url_options-methodを次のようにオーバーライドすることです。

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

次に、<%= form_for @article do | f | %>を使用でき、すべてのURLが正しく生成されます

于 2010-11-07T14:40:57.890 に答える
10

試す:

<%= form_for [:tab, @article] do |f| %>
   <%= f.label :title %>
   <%= f.text_field :title %>
    etc.
<%end%>
于 2010-09-19T07:16:26.300 に答える
1

パスを明示的に指定できます。

<%= form_for(@article, :url => article_path(@article, :tab => params[:tab]) %>
于 2010-09-18T23:02:17.090 に答える
1

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

...そして、:tabparamで管理するには、ヘルパーメソッドに追加できます。

于 2016-07-19T14:12:38.380 に答える
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
于 2012-02-16T22:52:12.740 に答える
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をこのソリューションに統合した後、私はいくつかのかなりのURLを取得しました。例:「http://mydomain.com/elections-2012/questions/my-question」

于 2012-09-09T19:02:00.863 に答える
0

これがどこまでさかのぼるかはわかりませんが、Rails6で機能します。

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

これは、配列URL生成構文のために機能します。このnew場合、@articleは永続化されていないものとして検出され、POSTルートにルーティングされます。このedit場合、@articleは永続化されていると検出されPUT、IDを持つルートにルーティングされます。

于 2020-10-22T13:50:45.273 に答える