我想与其他用户 not current_user 一起创建文章,并且我将会话中的ID保存到其他用户并且我在视图中使用一个集合恢复此ID,此时一切正常,但是当我尝试使用帮助:selected_user 进入我的文章控制器时如果句子在这里工作不是我的代码:
def new
if selected_user.present?
@article = selected_user.articles.build state: :step1
render_wizard
else
@article = current_user.articles.build state: :step1
render_wizard
end
end
所以,我问如果selected_user.present?我想用这个user_id 创建文章,但是我想用current_user创建它
我的创建方法是:
def create
if selected_user.present?
step = :step1
@article = selected_user.articles.build article_params_step1
@article.state = step.to_s
if @article.save
redirect_to wizard_path(next_step, article_id: @article)
else
render_wizard
end
else
step = :step1
@article = current_user.articles.build article_params_step1
@article.state = step.to_s
if @article.save
redirect_to wizard_path(next_step, article_id: @article)
else
render_wizard
end
end
end
所以,是的,当我运行我的视图时,控制器会跳转到else部分。
只是为了澄清我的selected_user不返回nil,但这是实现:
selections_controller.rb:
class SelectionsController < ApplicationController
before_action :authenticate_user!
def create
session[:selected_user_id] = params[:user][ :user_id]
redirect_to root_path
end
end
,在我的application_controller.rb中:
helper_method :selected_user
def selected_user
@selected_user ||= User.find(session[:selected_user_id])
end
并在视图中:
<%= form_tag( { :controller => "selections", :action => "create" } , :class => "navbar-form navbar-left") do %>
<%= collection_select(:user, :user_id, User.all, :id, :name, prompt: "Escoge cliente")%>
<%= submit_tag 'Enviar' %>
<% end %>
如果我尝试创建文章而不选择我的收藏中的用户,则会显示以下错误:
Couldn't find User with 'id'=
但是当我从集合中选择我的用户时,一切正常。所以,当我不选择使用current_user创建任何内容时,我只想要。
感谢您的时间!
问候!
答案 0 :(得分:1)
您看到错误的原因
Couldn't find User with 'id'=
如果您未选择user
,session[:selected_user_id]
为nil
且您的旧selected_user
包含以下代码,则会导致错误。
def selected_user
@selected_user ||= User.find(session[:selected_user_id])
end
User.find
方法需要单个id
或ids
数组。如果您给出一个id
并且如果它在数据库中找到相关记录,那么它将返回该实例。如果给出一组id,如果它在数据库中找到那些相关记录,那么它将返回这些实例的数组。但是,如果您将nil
传递给它,那么它将通过错误Couldn't find User with 'id'=
,因为它找不到相关记录。
但您更新的selected_user
实施:
def selected_user
@selected_user ||= session[:selected_user_id] && User.find_by_id(session[:selected_user_id])
end
正在运行,因为首先您要检查是否存在session[:selected_user_id]
值,然后才使用User.find_by_id
代替User.find
。
User.find_by_id
如果在数据库中找到它,则返回记录的单个实例;如果找不到记录,则返回nil
。它永远不会出错。
有关详细信息,请参阅ActiveRecord#find和ActiveRecord#find_by。
答案 1 :(得分:0)
我不确定为什么工作有什么不同,但我的解决方法是将此问题添加到 selected_user 方法:
def selected_user
@selected_user ||= session[:selected_user_id] && User.find_by_id(session[:selected_user_id])
end
并且我没有错误并且没有错误地输入if语句。