Rails ver。 5.0.0.1
我想通过投资组合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 :(得分:0)
你正好通过params,但是你没有正确阅读它们。您当前的代码:
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_to
转到new
方法吗?如果有人使用其他路径转到new
(例如在浏览器中输入网址),而未设置portfolio_id
,会发生什么?不用你的代码吗?
3)您确定只需Property
即可创建portfolio_id
个对象吗?通常,您将property_params
传递给新方法以创建新的Property
。
这些事情是你在一段时间内考虑它们时应该在不同的问题中解决的所有事情,但现在应该通过link_to
传递参数。
答案 1 :(得分:0)
我认为您需要在nested_attributes
模型中接受property
模型portfolio
。然后,从投资组合的展示页面,您可以使用property
方法为特定portfolio
添加link_to_add
。
投资组合模型
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
接受私有方法
中的嵌套属性private
def portfolio_params
params.require(:portfolio).permit(:list_of_portfolio_parameters, properties_attributes: [ :list_of_properties_parameters, :_destroy ])
end
然后在property
Portfolio
方法的html页面中构建new
个属性。希望它会对你有所帮助。