ruby-on-rails - rails : what is the “correct” (idiomatic) way to pass a parameter from new to create in a RESTful controller?

标签 ruby-on-rails rest

我有一个很常见的情况和解决方案,但我想请教Rails专家是否可以改进。

我有一个非常典型的 RESTful Controller ,用户在创建时提供一些对象属性。有一个 thing 模型、一个 ThingsController 和各种 View ,包括 newcreate _form 部分。

一个事物有两个属性,

  1. 颜色,当他们点击链接创建颜色时设置(即“创建红色事物”链接,将红色 ID 编码为 URL 参数)
  2. 描述,由用户在表单 View 中输入

我对处理属性(例如用户在表单中指定的描述)的方法感到满意,但对处理通过与第一个关联的 URL 参数传递的属性的方式不太有信心点击。

这就是我现在正在做的事情(请注意,为了简化问题,我省略了错误检查)。首先,我在 Controller 中的 newcreate 方法如下:

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/

相关文章:

rest - 通过 REST v3 上传的文件显示为 "Untitled"

ruby-on-rails - Unicorn - 使用 HUP 实现零停机?

ruby-on-rails - 在 Rails 中使用 has_many 关联与单个表继承模型

ruby-on-rails - rails 3.2.8 中未定义的 read_inheritable_attribute

python - www.example.com/post/21/edit 是 RESTful URI 吗?我想我知道答案,但还有一个问题

java - 如何将 Jersey REST web 服务添加到嵌入式 tomcat 中?

ruby-on-rails - 渲染 : collection? 时如何访问集合的其他元素

html - Rails 复选框和 field_with_errors 问题

rest - 在 ZF2 中授权不成功时如何跳过 Controller 操作

java - 在 java rest 服务中发送 excel 作为下载响应时要设置的编码类型是什么