我有一个很常见的情况和解决方案,但我想请教Rails专家是否可以改进。
我有一个非常典型的 RESTful Controller ,用户在创建时提供一些对象属性。有一个 thing
模型、一个 ThingsController
和各种 View ,包括 new
、create
和 _form
部分。
一个事物有两个属性,
- 颜色,当他们点击链接创建颜色时设置(即“创建红色事物”链接,将红色 ID 编码为 URL 参数)
- 描述,由用户在表单 View 中输入
我对处理属性(例如用户在表单中指定的描述)的方法感到满意,但对处理通过与第一个关联的 URL 参数传递的属性的方式不太有信心点击。
这就是我现在正在做的事情(请注意,为了简化问题,我省略了错误检查)。首先,我在 Controller 中的 new
和 create
方法如下:
def new
@thing = Thing.new
@thing.color = Color. find(params[:color])
end
def create
@thing = Thing.new(params[:thing])
@thing.color = Color. find(params[:color])
if @thing.save
flash[:notice] = "Successfully created thing."
redirect_to somewhere_url
else
render :action => 'new'
end
end
new
View 仅调用 _form
部分,如下所示:
<% form_for @thing do |f| %>
<%= f.error_messages %>
<%= hidden_field_tag "color", @thing.color.id %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= f.submit "Submit" %>
<% end %>
通过在表单中放置一个隐藏字段,将颜色 ID 作为 URL 参数传递给 create
方法似乎有点困惑。这看起来合理吗?或者还有其他更好的方法吗?
最佳答案
通常在这种情况下,我会在表单中放置一个隐藏字段,该字段将保存 color_id。这种方式的好处是,您只需在渲染表单之前设置对象的颜色即可。所以你的 Controller 更改为:
def new
@thing = Thing.new
@thing.color = Color. find(params[:color])
end
def create
@thing = Thing.new(params[:thing])
if @thing.save
flash[:notice] = "Successfully created thing."
redirect_to somewhere_url
else
render :action => 'new'
end
end
您的表单将更改为
<% form_for @thing do |f| %>
<%= f.error_messages %>
<%= f.hidden_field :color_id %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= f.submit "Submit" %>
<% end %>
然后颜色会传递到两个表单,您只需要检索第一个表单中的颜色。 (不要忘记添加验证您的事物模型以确保它具有有效的颜色)。
关于ruby-on-rails - rails : what is the “correct” (idiomatic) way to pass a parameter from new to create in a RESTful controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2223853/