【发布时间】:2015-08-28 14:44:18
【问题描述】:
我有三个模型,具有has_many :through 关联:
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
end
class Calendar < ActiveRecord::Base
has_many :administrations
has_many :users, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
joinAdministration 模型具有以下属性:
id
user_id
calendar_id
role
这是我目前的路线:
devise_for :users, :path => 'account'
resources :users do
resources :calendars
end
更新
这里是Calendars#create 代码:
def create
@user = current_user
@calendar = @user.calendars.create(calendar_params)
respond_to do |format|
if @calendar.save
format.html { redirect_to user_calendar_path(@user,@calendar), notice: 'Calendar was successfully created.' }
format.json { render :show, status: :created, location: @calendar }
else
format.html { render :new }
format.json { render json: @calendar.errors, status: :unprocessable_entity }
end
end
end
每当user 创建一个新的calendar 时,我想将这个特定的user 分配给“所有者”的role — 在administration 连接模型中。
我认为最好的方法是在calendar 模型中使用after_create 回调,如下所示:
class Calendar < ActiveRecord::Base
has_many :administrations, dependent: :destroy
has_many :users, through: :administrations
after_create :set_default_role
protected
def set_default_role
current_user.calendar.role = "Owner"
end
end
但是,当我继续尝试创建新日历时,出现以下错误:
NameError in CalendarsController#create
undefined local variable or method `current_user' for #<Calendar:0x007f88f8f26998>
Extracted source (around line #10):
def set_default_role
current_user.calendar.role = "Owner"
end
end
经过一番研究,我发现this question on Quora的答案如下:
模型直接了解 当前用户;这是与应用程序“状态”或会话相关的 问题。控制器应该管理当前用户。
我不得不说我有些困惑:一般原则是通过将逻辑放在模型中来保持控制器的精简。但是,上面的答案建议做相反的事情,因为模型不应该知道当前用户。
那么,回到我最初的问题:如何在用户创建新日历时为他定义默认角色?
我应该使用after_create 回调,使用其他东西而不是current_user 来获取他的id,还是使用完全不同的解决方案?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 devise callback has-many-through