如何通过link_to传递参数

时间:2016-08-21 00:49:35

标签: ruby-on-rails ruby associations

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

2 个答案:

答案 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个属性。希望它会对你有所帮助。