创建belongs_to对象的最佳实践

时间:2014-11-07 22:29:07

标签: ruby-on-rails ruby-on-rails-4

我们说我们有以下情况:

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.rbTicket } 被建造。

这是创建属于其他对象的新对象的好习惯吗?我还在学习,所以我想说清楚:)谢谢。

2 个答案:

答案 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