Rails与其他用户而不是current_user创建文章

时间:2016-03-01 19:16:35

标签: ruby-on-rails ruby session

我想与其他用户 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创建任何内容时,我只想要。

感谢您的时间!

问候!

2 个答案:

答案 0 :(得分:1)

您看到错误的原因

Couldn't find User with 'id'=

如果您未选择usersession[:selected_user_id]nil且您的旧selected_user包含以下代码,则会导致错误。

def selected_user
  @selected_user ||= User.find(session[:selected_user_id])
end

User.find方法需要单个idids数组。如果您给出一个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#findActiveRecord#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语句。