【问题标题】:Rails Create article with other user not current_userRails 使用非 current_user 的其他用户创建文章
【发布时间】:2016-03-01 19:16:35
【问题描述】:

我想与其他用户 not current_user 创建一篇文章,为此我将在会话中将 ID 保存给其他用户 strong> 并且我使用视图中的集合来恢复此 id,到目前为止一切正常,但是当我尝试使用 helper :selected_user 到带有 if 语句 在这里不起作用是我的代码:

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 创建的任何内容时,我只是想要。

感谢您的宝贵时间!

问候!

【问题讨论】:

  • 能否请您提供selected_user 辅助方法的代码?
  • 你遇到了什么错误?
  • 如果您希望 selected_user 返回会话中保存的用户(不是 current_user),但返回的是 nil,那么 selected_user 逻辑似乎有问题。请提供selected_user的实现细节以供进一步审核。
  • 好的,谢谢!我编辑了我的帖子@Dharam
  • 您检查了session[:selected_user_id]selected_user 中的值吗?还要检查 User.find(session[:selected_user_id]) 返回的内容。

标签: ruby-on-rails ruby session


【解决方案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 方法需要单个 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 了解更多信息。

【讨论】:

    【解决方案2】:

    我不确定为什么会起作用以及有什么不同,但我的解决方案是将其添加到我的 selected_user 方法中:

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

    因此我没有 nil 错误,并且没有错误地进入 if 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多