如何解决Rails 5,找不到没有ID的用户您可以通过表单传递对象吗?
我正在尝试为用户编写将技能(属于用户,技术和级别)添加到技能的功能的代码。
我在skill / new.html.erb中有一个simple_for_for:
<%= simple_form_for [ @user,@skill ] do |f| %>
<p>Select Tech</p>
<div>
<%= f.collection_select :technology_id,@techs,:id,:name%>
</div>
<p>Select Level</p>
<div>
<%= f.collection_select :level_id,@levels,:name%>
</div>
<%= f.submit "Submit",class: "btn btn-primary" %>
<% end %>
技能控制器::“新操作”会将“技术”和“级别”对象列表传递给simple_form_for,因此用户可以选择的选项是所有“技术和级别”的列表(例如,“ Tech:Ruby”,“级别:初级)。
class SkillsController < ApplicationController
before_action :authenticate_user!
def index
@skills = policy_scope(Skill)
end
def new
@techs = Technology.all
@levels = Level.all
@skill = Skill.new
@user = current_user
authorize @skill
end
def create
skill = Skill.new(skill_params)
authorize skill
if skill.save
redirect_to projects_path
else
render :action => "new",@user => params[:user_id],@skill => skill
end
end
private
def skill_params
params.require(:skill).permit(:user_id,:technology_id,:level_id)
end
end
我遇到几个问题:
在无法保存新技能后,else子句未将@user和@skill正确发送到表单,但是我不知道语法是否正确。
实际问题:表格是否可以传递与所选选项相关联的技术和级别ID,而不是对象本身?我尝试手动手动查找所有技能组件,如下所示,这会导致“找不到没有ID的用户”错误:
def create
skill = Skill.new()
technology = Technology.find(skill_params[:technology_id])
level = Level.find(skill_params[:level_id])
user = User.find(skill_params[:user_id])
skill.user = user
skill.technology = technology
skill.level = level
authorize skill
if skill.save
redirect_to projects_path
else
render :action => "new",@user => user,@skill => skill
end
end
private
def skill_params
params.require(:skill).permit(:technology_id,:level_id,:user_id)
end
解决方法
首先请确保您已经建立了从用户到技能的关联,可以根据以下条件建立新的记录
class User
has_many :skills
end
如果您的应用程序仅允许用户向自己的帐户添加技能,则应从会话中获取当前用户:
def create
@skill = current_user.skills.new(skill_params)
authorize @skill
if @skill.save
redirect_to projects_path
else
render :new
end
end
请注意,这消除了完全嵌套表单和路由的需要:
resources :skills
<%= simple_form_for @skill do |f| %>
# ...
<% end %>
,
在创建动作中,您可以先设置@user
和@skill
,然后再尝试创建/保存它们,然后可以在else子句中进行新的渲染:
def create
@user = current_user
@skill = Skill.new(skill_params)
authorize @skill
if @skill.save
redirect_to projects_path
else
render :new
end
end
是的,您可以传递ID,因为ID将保存在数据库中。
发生错误的原因找不到没有ID的用户,可能是因为skill_params没有user_id。您可以使用current_user
帮助方法而不是通过表单来获取user_id。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。