2015-07-19 42 views
1

我应该手动添加一个user_id到隐藏的窗体中吗?或者,还有更好的方法?Ruby on Rails:手动保存用户标识?还是有更好的方法?

我有型号:

class Project < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :projects 
end 

笔者认为:

<%= simple_form_for @project do |f| %> 
    <%= f.hidden_field :value => current_user.id %> 
<% end %> 

或者有另一种方式做到这一点?我想如果模型是相互关联的,它会自动将user_id添加到项目的数据库中?

谢谢!


编辑:转换了所有的旅行项目,这样别人需要帮助的知道

+0

您可以将其保存在控制器动作了。 – Pavan

+0

你为什么不使用关联。旅程可以属于用户,然后你可以做'current_user.trip.build(trip_params)' – Deep

+0

@深,我的版本更好 – asiniy

回答

4

没有。这不应该是形式上的,因为每个人都可以在形式上改变隐藏的价值。

假设你使用强大的参数

def create 
    @project = Project.new(project_params) 
    @project.save # or something else 
end 

def project_params 
    params.require(:project).permit(something_permitted_here) 
    .merge(user_id: current_user.id) 
end 
3

如果你把隐藏的表单上的用户ID,将导致安全违反。由于使用浏览器工具,黑客可以更改user_id并为其他用户注入信息。更好的方法是将其放入控制器中。

+1

为什么当它说明正确的事情时会降低它? upvoted –

1

内部控制器,你可以这样做:

def create 
    @project.user = current_user 
    @project.save 
    #... 
end 

这种方式,您保护自己免受别人手动更改HTML中的user_id

1

使用联想到你的优点:

def create 
    @project = current_user.projects.build(project_params) 
    if @project.save 
    # ...etc 
end