在 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

这使得blahblah= 方法可用,您可以使用它们来处理传入的数据。

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 中传递没有模型关联的变量的主要内容,如果未能解决你的问题,请参考以下文章

了解 Rails 控制器 - 通过关联模型的实例变量查看连接

在模型中使用 Rails 应用程序配置变量

ruby on rails 在关联调用中使用变量

rails 3中没有模型的控制器的路由

Rails 查询关联的模型范围

没有数据库表的rails下拉菜单关联....