rails simple_form 关联新加入 table 记录
rails simple_form association on new join table record
当我尝试为我的模型 UserLanguage 创建一个新记录时,我不断收到错误 "undefined method `model_name' for nil:NilClass",它有两个外键:语言和用户。
表单提交后,新的 UserLangauge 对象的 language_id 为 nil。
user_languages#新观点
<%= simple_form_for(@user_language) do |f| %>
<%= f.association :language, label_method: :name, value_method: :id, include_blank: false, include_hidden: false %>
<%= f.input :proficiency, collection: @proficiencies, include_blank: false, include_hidden: false %>
<%= f.submit "Add Language"%>
<% end %>
user_languages 控制器
def new
@user_language = UserLanguage.new
...
end
def create
user_language = UserLanguage.new(user_language_params)
user_language.user = current_user
if user_language.save
redirect_to my_account_path
else
render :new
end
end
private
def user_language_params
params.require(:user_language).permit(:language, :proficiency, :seeking, :sharing)
end
我为用户分配 current_user(设计),但无法获得与新 user_langauge 记录关联的语言....
我什至尝试在保存对象之前从源数据中手动分配 @user_language.language_id = params[:language],但是由于未知原因 langauge_id 被分配为 0。
问题是您在创建方法中分配 user_language = ...
。这分配一个局部变量而不是一个实例变量。局部变量仅在该词法范围内可用(在本例中为 create 方法),而 Rails 将控制器实例变量公开给视图。
您可以将此方法重写为:
def create
@user_language = current_user.user_languages
.new(user_language_params)
if @user_language.save
redirect_to my_account_path
else
render :new
end
end
这假设您已经在 User
class 中设置了 has_many :user_languages
关系。
当我尝试为我的模型 UserLanguage 创建一个新记录时,我不断收到错误 "undefined method `model_name' for nil:NilClass",它有两个外键:语言和用户。
表单提交后,新的 UserLangauge 对象的 language_id 为 nil。
user_languages#新观点
<%= simple_form_for(@user_language) do |f| %>
<%= f.association :language, label_method: :name, value_method: :id, include_blank: false, include_hidden: false %>
<%= f.input :proficiency, collection: @proficiencies, include_blank: false, include_hidden: false %>
<%= f.submit "Add Language"%>
<% end %>
user_languages 控制器
def new
@user_language = UserLanguage.new
...
end
def create
user_language = UserLanguage.new(user_language_params)
user_language.user = current_user
if user_language.save
redirect_to my_account_path
else
render :new
end
end
private
def user_language_params
params.require(:user_language).permit(:language, :proficiency, :seeking, :sharing)
end
我为用户分配 current_user(设计),但无法获得与新 user_langauge 记录关联的语言....
我什至尝试在保存对象之前从源数据中手动分配 @user_language.language_id = params[:language],但是由于未知原因 langauge_id 被分配为 0。
问题是您在创建方法中分配 user_language = ...
。这分配一个局部变量而不是一个实例变量。局部变量仅在该词法范围内可用(在本例中为 create 方法),而 Rails 将控制器实例变量公开给视图。
您可以将此方法重写为:
def create
@user_language = current_user.user_languages
.new(user_language_params)
if @user_language.save
redirect_to my_account_path
else
render :new
end
end
这假设您已经在 User
class 中设置了 has_many :user_languages
关系。