在 Rails 中传递没有模型关联的变量
Posted
技术标签:
【中文标题】在 Rails 中传递没有模型关联的变量【英文标题】:Pass variables without model associations in Rails 【发布时间】:2012-10-06 09:59:52 【问题描述】:我有一个变量,我想通过 Rails 中的表单传递。
该变量不方便,因为它不是模型的一部分。我真的不想在数据库中创建一个列,这样我就可以传递变量。
当我尝试使用无害的东西传递变量时:
<input type="hidden" id="blah" value=<%= "#@blah" %> />
隐藏字段在源代码中正确显示,但未与 params 哈希一起传递。当我用id="review_blah"
之类的东西正确编码时,rails 认为它是审查模型的一部分,并且因为它不是模型的一部分而生气。
没有解决办法吗?有什么方法可以在这些情况下轻松传递变量,而无需重新构建模型?
谢谢
【问题讨论】:
你试过 params[:blah] 吗? 【参考方案1】:您需要为虚拟属性定义一个attribute_accessor
,并且需要将其添加到attr_accessible
列表中,以便在表单中使用它。像这样:
attr_accessor :blah
这使得blah
和blah=
方法可用,您可以使用它们来处理传入的数据。
def blah=(data)
#do sth. with the submited data here
end
在这种情况下,您可以访问在“blah”字段中输入的数据作为局部变量“data”。
那你需要把它变成正则形式的一部分:
<%= f.hidden_field :blah, :value => <Your value here> %>
所以您需要做的最后一件事就是将该字段添加到attr_accessible
列表中。
attr_accessible :blah,....
否则请求会因为批量分配保护而失败。
【讨论】:
【参考方案2】:在模型中
attr_accessible :blah
【讨论】:
【参考方案3】:虽然它很丑,但你可以做类似以下的事情
<input name='x' type="hidden" id="blah" value=<%= "#@blah" %> />
在你的控制器中
@model.save
Model.update_all(:my_attribute => params['x'], :id => @model.id)
【讨论】:
【参考方案4】:你需要设置我认为的输入参数的名称。否则它不会包含在 Rails 参数哈希中。
<input type="hidden" id="blah" value=<%= "#@blah" %> name="blah"/>
【讨论】:
【参考方案5】:class ModelName
attr_accessor :blah
end
@model = ModelName.new
@model.blah = "blah blah"
@model.blah #will return "blah blah"
您的表中不需要有列。检查here 这样你就可以拥有
=form_for @model do |f|
=f.hidden_field :blah
这将在params
散列中沿对象传递blah
。
【讨论】:
以上是关于在 Rails 中传递没有模型关联的变量的主要内容,如果未能解决你的问题,请参考以下文章