好的,所以目前我有一个表单
<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 = App.new(params[:app])
然而,我有(伪代码(的关联
user has_many apps
apps belongs_to user
问题:在create方法中这样做更安全吗(这样表单就不会被修改(?
@user = current_user
@app = @user.apps.create(params[:app])
如果是这样的话……我该如何实际实现上面的代码(语法不正确……只是伪代码(?
谢谢!
是的,使用您建议的第二种方法是的最佳方法
@user = current_user
@app = @user.apps.create(params[:app])
还要确保你保护自己不受大规模任务的影响,读一读这篇文章http://stephensclafani.com/2010/01/04/ruby-on-rails-secure-mass-assignment/
第二种方法绝对更安全。如果你用第一种方式,你就相信客户会说出他们是谁。任何人都可以很容易地修改表单(使用firebug,或者使用许多工具手动提交POST
请求(,最终使用另一个人的current_user
提交表单。
确保在整个应用程序中处处应用这种思想。永远不要相信客户提交的任何东西。
第二个代码片段比第一个更"RESTful"。我的意思是,如果一个应用程序是一个通过用户逻辑访问的资源,那么无论如何都要使用它
你通过路线设置的方式:
resources :users do
resources :apps
end
这将为您提供路径,如user_app_path和new_user_app_path,您可以将用户ID和应用程序ID或新应用程序传递到这些路径。
希望这能帮助