Rails 3 - 在隐藏表单字段中使用user.id与使用关联

时间:2011-05-13 18:45:25

标签: ruby-on-rails ruby-on-rails-3 forms associations has-many

好的,目前我有一张表格

<div class="field">
  <%= f.label :title %><br/>
  <%= f.text_field :title %><br/>
  <%= f.label :itunesurl %><br />
  <%= f.text_field :itunesurl %><br />
  <%= f.hidden_field :user_id, :value => current_user.id %>
</div>
<div class="actions">
  <%= f.submit %>
</div>

将current_user.id传递给我的“app”模型的create方法,该方法在保存之前将其创建为:

@app = App.new(params[:app])

但是我有(伪代码)

的关联
user has_many apps
apps belongs_to user

问题:在create方法中执行类似的操作是否更安全(因此表单不会被修改)?

@user = current_user
@app = @user.apps.create(params[:app])

如果是这样......我究竟会如何实际实现上面的代码(它在语法上不正确..只是伪)?

谢谢!

3 个答案:

答案 0 :(得分:9)

是的,使用您建议的第二种方式是最好的方法

@user = current_user
@app = @user.apps.create(params[:app])

另外,请确保您保护自己免受大规模任务的影响,请阅读此http://stephensclafani.com/2010/01/04/ruby-on-rails-secure-mass-assignment/

答案 1 :(得分:4)

以第二种方式做到这一点绝对安全。如果你是第一种方式,那么你就是相信客户要说明他们是谁。任何人都可以轻松修改表单(使用firebug,或者他们可以使用许多工具手动提交POST请求)并最终使用另一个人的current_user提交表单。

确保在整个应用中应用此思维。不要相信客户提交的任何内容。

答案 2 :(得分:1)

第二个代码片段比第一个更加“RESTful”。通过更多RESTful,我的意思是,如果应用程序是通过用户逻辑访问的资源,那么一定要使用它。

您通过路线设置的方式:

resources :users do
  resources :apps
end

这会为您提供 user_app_path new_user_app_path 等路径,您可以向其传递用户ID和应用ID或新应用。

希望这有帮助