Rails - 添加记录以从控制器连接表

Chr*_*len 9 activerecord join ruby-on-rails

我正在尝试通过按钮的操作在连接表中创建记录.我会有一个事件模型,并希望跟踪每个用户的选定事件.

我使用HABTM关系,因为我不需要任何额外的字段.

User.rb:

has_to_and_belongs_to_many :events
Run Code Online (Sandbox Code Playgroud)

Event.rb:

has_to_and_belongs_to_many :users
Run Code Online (Sandbox Code Playgroud)

Events_Users迁移:

[user_id, event_id, id=>false]
Run Code Online (Sandbox Code Playgroud)

我对实际创建的记录感到困惑.有人在早些时候帮助我在控制台中添加记录:

u = User.find(1)
u.events << Event.find(1) 
Run Code Online (Sandbox Code Playgroud)

现在我想通过点击链接来执行操作......这是正确的方向吗?

def add
  @user = User.find(session[:user_id])
  @event = Event.find(params[:id])
  if @user.events.save(params[:user][:event])
    flash[:notice] = 'Event was saved.'
  end
end
Run Code Online (Sandbox Code Playgroud)

我应该添加一个@user.events.new地方,如果是这样,我在哪里放哪个用户和哪个事件的参数?

Gde*_*lin 14

以下代码应该有效(假设您传入一个名称为id的参数,该参数对应于事件对象的id):

   def add
     @user = User.find(session[:user_id])
     @event = Event.find(params[:id])
     @user.events << @event
     flash[:notice] = 'Event was saved.'
   end
Run Code Online (Sandbox Code Playgroud)

我在你的代码中看到的问题是:

  1. 您正在将哈希传递给.save.Save应该只取一个布尔值,对应是否应该运行验证,默认情况下为true.但是.create和.new可以接受值的哈希值.(.save将在.new之后使用).

  2. 您通过params [:id]加载事件,但之后您尝试通过params [:user] [:event]创建事件.你想做什么?创建还是加载?(我的例子假设加载)

  3. 当用户单击按钮并提交表单而不是"单击链接"时,应该发生具有此效果的操作.此代码可能容易受到跨站点请求伪造(有人可能会欺骗某人点击运行此操作的另一个站点上的链接).如果正确实现,Rails表单会受到保护,因为它们使用请求伪造保护令牌.

  4. 您很可能希望在此操作后重定向用户.在执行这样的操作(而不是重定向)之后渲染页面被认为是不好的做法.