2016-08-21 16 views
0

Rails ver。 5.0.0.1link_toでパラメータを渡す方法

ポートフォリオのSHOWページからlink_toを使用して新しいプロパティを作成して割り当てたいとします。リンクは、残りのプロパティフォームを完了した後、portfolio_idをパラメータとして渡して保存する必要があります。

私はこの質問を何度も聞いたことがありますが、何らかの理由で自分のアプリで正解を適用しても機能していません。どんな助けもありがとう、ありがとう!

# portfolio show.html.erb 

<%= link_to 'Add New Property To This Portfolio', new_property_path(:portfolio_id => @portfolio.id) %> 

# properties controller 

def new 
@portfolio = :portfolio 
@property = Property.new(params[:portfolio_id => @portfolio]) 
end 

# portfolio model 

has_many :properties 

# property model 

belongs_to :portfolio 
accepts_nested_attributes_for :portfolio 

答えて

0

パラメータは正常に渡していますが、正しく読み込まれていません。あなたの現在のコード:

def new 
    @portfolio = :portfolio 
    @property = Property.new(params[:portfolio_id => @portfolio]) 
end 

読んでください:あなたが対処したい場合がありますあなたのコードと他のいくつかの問題があります

def new 

    # Rails stores params passed through a link_to in the params 
    # hash, like any other parameter 

    @portfolio = params[:portfolio] 
    @property = Property.new(params[:portfolio_id => @portfolio]) 
end 

を:

1)あなたは@portfolioというフィールドを持っているが、しかし、それはidを含んでいます。通常、そのような単純な名前は、Portfolioオブジェクトのインスタンスを格納します。フィールドにidが格納されている場合は、末尾に_idを追加します。 Rubyのようなスクリプト言語にとって重要な、データ型に関する良い推測を提供します。

2)link_tonewメソッドに変更してもよろしいですか?誰かがを設定せずに別のパスを使用してnew(ブラウザのURLを入力するなど)になるとどうなりますか?あなたのコードは壊れませんか?

3)portfolio_idPropertyオブジェクトを作成することはできますか?通常、property_paramsを新しいメソッドに渡して新しいPropertyを作成します。

これらのことは、それらについてしばらく考えれば、異なる質問で対処する必要があるすべてのものですが、link_toでパラメータを渡すことは今解決する必要があります。

0

nested_attributespropertyモデルをportfolioモデル内に受け入れる必要があると思います。次に、ポートフォリオのショーページから、メソッドを使用して特定のportfoliopropertyを追加できます。

ポートフォリオモデル

has_many :properties 
accepts_nested_attributes_for :properties, :allow_destroy => true,, reject_if: :all_blank 

プロパティモデル

belongs_to :portfolio 

PortfoliosController。RB

##Build in new method: 

def new 
    @portfolio_object = Portfolio.new 
    @portfolio_object.properties.build 
end 

は、その後、あなたのPortfolionew方法のhtmlページにproperty属性を構築し、民間の方法で、ネストされた属性

private 

def portfolio_params  
    params.require(:portfolio).permit(:list_of_portfolio_parameters, properties_attributes: [ :list_of_properties_parameters, :_destroy ]) 
end 

を受け入れます。それがあなたを助けることを願っています。

関連する問題