2016-03-01 41 views
0

我想创建一个文章与其他用户不CURRENT_USER并为我在一个会话ID保存到其他用户我收回这个ID与视图中收集到这个地步一切工作正常,但是当我试图用我的帮手:selected_user到我的文章控制器与if语句不在这里工作是我的代码:Rails的创建与其他用户的文章不CURRENT_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 

所以,是的,当我跑我的看法控制器跳转到其他部分。

只是为了澄清我selected_user不归为零,但这里是实现:

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

请问您可以包含'selected_user'辅助方法的代码吗? – JackCollins

+0

你得到的错误是什么? –

+0

如果您希望'selected_user'返回保存在会话中的用户(不是current_user),但返回'nil',那么'selected_user'逻辑中似乎有错误。请提供'selected_user'的实现细节以供进一步查看。 – Dharam

回答

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

+0

哇!非常感谢你的解释! –

0

我不知道为什么是工作,什么是不同的,但我对这个问题的解决方案是把它添加到我的selected_user方法:

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

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

相关问题