我们说我们有以下情况:
class User < ActiveRecord::Base
has_many :tickets
end
class Ticket < ActiveRecord::Base
belongs_to :user
end
为简单起见,我们说Ticket
只有一些文字字段description
和整数user_id
。如果我们打开用户的views/users/show.html.erb
视图,并且在用户控制器内部,我们会使用此代码找到所选的正确用户:
def show
@user = User.find(params[:id])
end`
现在在show.html.erb
视图中我们还有一个小代码剪切,用于创建用户的票证。这是创建它的好习惯吗?
视图/用户/ show.html.erb
<%= simple_form_for Ticket.new do |f| %>
<%= f.hidden_field :user_id, :value => @user.id %>
<%= f.text_area :description %>
<%= f.submit "Add" %>
<% end %>
控制器/ tickets_controller.rb
def create
@ticket = Ticket.new(ticket_params)
@user = User.find(ticket_params[:user_id])
@ticket.save
end
def ticket_params
params.require(:ticket).permit(:user_id, :description)
end
因此,当我们为用户创建故障单时,故障单description
和他的user_id
(视图中的隐藏字段)会传递到tickets_controller.rb
新Ticket
} 被建造。
这是创建属于其他对象的新对象的好习惯吗?我还在学习,所以我想说清楚:)谢谢。
答案 0 :(得分:0)
您应该可以在表单中执行以下操作:
<%= f.association :user, :as => :hidden, :value => @user.id %>
这会将user_id通过您的控制器传递给您的模型并自动建立关联。您不再需要控制器中的@ user =行。
请勿忘记用户可以修改表单并发送他们想要的任何ID。 :)
有关详细信息,请参阅https://github.com/plataformatec/simple_form#associations。
答案 1 :(得分:0)
如何使用current_user
从控制器中获取用户,以便保护自己免受任何操纵表单中user_id
值的人的伤害。另外我认为这种方式更清晰
<强>视图/用户/ show.html.erb 强>
<%= simple_form_for Ticket.new do |f| %>
<%= f.text_area :description %>
<%= f.submit "Add" %>
<% end %>
<强>控制器/ tickets_controller.rb 强>
def create
@ticket = Ticket.new(ticket_params)
@ticket.user = current_user
@ticket.save
end
def ticket_params
params.require(:ticket).permit(:user_id, :description)
end