【问题标题】:rails, pass arguments in when setting a new objectrails,在设置新对象时传入参数
【发布时间】:2010-10-03 11:22:23
【问题描述】:

在rails中,是否可以在创建新对象时传入参数,并相应地设置一些值?

例如,如果我有一个带有项目列表的屏幕,并且在顶部有一个用于创建新项目的链接。如果我要在“新”链接旁边放置一个“项目类型”下拉列表,我将如何将该值传递给项目控制器上的新函数并设置@item.item_type?


在下方JC回复后编辑

如果在控制器中我有以下内容:

@entry = Entry.new

if (params[:type])
  @entry.entry_type = params[:type]
end

制作新对象的链接是

<%= link_to "Make new article", {:controller => '/dashboard/entries', :action => :new}, :type => 1 %>

那么 new.html.erb 表单中的 entry_type 字段不应该设置为 1 吗?

【问题讨论】:

  • 我尝试将作为参数添加到 form_for: params[:type], :html => {:multipart => true} do |f| %> 但这不起作用

标签: ruby-on-rails ruby


【解决方案1】:

您所描述的只是控制器的new 操作和相应的create 操作的标准表单,用于接收表单数据并创建对象。您可以生成脚手架文件以查看其工作原理的示例,但简而言之,它是这样的(假设是 RESTful 设计):

# new.html.erb
<% form_for @item || Item.new do |f| %>
  <%= f.select :type, { 'type1' => 1, 'type2' => 2 } %>
  <%= f.submit %>
<% end %>

# ItemsController#create
@item = Item.new(params[:item])
if @item.save
  redirect_to @item
else
  render :new
end

表单中的数据在控制器的params 哈希中可用,用于初始化新对象。

【讨论】:

  • 我正在写一个类似的答案。没错,这是一个绝对标准的表单选择。代码中只有一个细节:与其编写 Item.new 不如使用 @item (来自控制器),这样,来自 action create 的 render :new 将保留用户以前的值。
  • 您好,我仍然不明白新对象如何获取传入的值。我在原始帖子中添加了额外的解释,所以请展示我正在尝试的内容
  • @tokland - 你是对的。我将更新我的代码以显示我在模板中的实际操作。最初我只是给出一个非常简单的版本。
  • @ntokyo - 我认为您使用 link_to 不正确。这可能是您想要的:&lt;%= link_to "Make new article", {:controller =&gt; '/dashboard/entries', :action =&gt; :new, :type =&gt; 1} %&gt;。实际上,您在 HTML 链接元素上放置了一个“类型”属性,而不是实际传递查询字符串中的值。
猜你喜欢
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多