2012-06-04 42 views
2

我的Rails应用程序,我的错误信息无法正确显示。我认为原因是因为验证失败,我的控制器做了一个重定向,而不是渲染。然而,即时通讯有麻烦渲染。我所有的变数似乎都没有了。例如在我的pub_messages#创建我有...轨呈现遗漏变量

def create 
    @pub_message = current_user.pub_messages.build 
    @pub_message.to_id = params[:pub_message][:to_id] 
    @pub_message.user_id = current_user.id 
    @pub_message.content = params[:pub_message][:content] 
    if @pub_message.save 
     flash[:success ] = "Your post has been sent" 
     redirect_to user_path(params[:pub_message][:to_id]) 
    else 
     render 'users/show' 
    end 
end 

^(在一个侧面说明,即时通讯maually节约每一由于一些安全问题的属性,所以我没有做:to_id attr_accessible)

但回点,当我这样做使“用户/秀”,现在看来似乎无法找到任何我的变量。它进入我的用户显示视图,抱怨......

undefined method `name' for nil:NilClass 
1: <% provide(:title, @user.name) %> 

然而,如果去了我的用户#显示行动,我宣布@user。

def show 
    @user = User.find(params[:id]) 
    @current_user = current_user 
    if user_signed_in? 
     @message = current_user.messages.build 
     @pub_message = current_user.pub_messages.build 
    end 
    @feed_items = @user.feed.paginate(page: params[:page], per_page: 20) 
end 

我错过了还是做错了什么? 谢谢

更新:所以它看起来好像没有去显示操作。我怎么能解决不显示的错误消息?如果我做了重定向,是不是会导致浏览器立即请求一个新的页面?因此我的错误信息永远不会出现?

更新2:所以...我实际上不是来自模型的'新'页面,而是来自用户展示模板。而在模板中,我有以下

<%= form_for([current_user, @pub_message]) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <%= f.hidden_field :to_id, :value => @user.id %> 
    <div class="micropost_message_field"> 
    <%= f.text_area :content, placeholder: "Comments?", :id => 'public_message_text' %> 
    </div> 
    <%= f.submit "Post", class: "btn btn-large btn-primary" %> 
<% end %> 

这是对象是越来越建成,并最终进入到我的pub_messages#创建。如果我做重新初始化所有的变量,我需要将所有的模板中的共享文件夹,以及因为它抱怨说。

还是有更好的方式来做到这一点?也许像渲染'新',然后重定向到用户#show?

回答

0

你没有调用show动作,你只是渲染模板,所以@user没有被定义。

您可以尝试其他重定向而不是呈现模板。

2

当您进行渲染时,控件直接从此操作直接进入视图模板,并且不会触及您的users_controller。这就是你的变量缺失的原因。

但是,当您重定向时,它将转到users_controller,就好像来自用户的新请求一样。

相反的render 'users/show',尝试redirect_to :controller => :users, :action => :show, :id => current_user.id

重定向确实显示了Flash通知和错误。重定向在这种情况下非常常见。

这有帮助吗?

+0

哦,我编辑后。不重定向不显示失败的验证? – Sasha

+0

重定向确实显示Flash通知和错误。 – Anil

+0

哦,真的吗?嗯,那么它一定是从别的东西... – Sasha

3

重定向将显示提示信息,但它不会显示验证错误。既然你不设置闪光灯的错误消息,我猜你想显示为模型的验证错误。为此,您需要坚持渲染,而不是重定向。

为了渲染,您需要初始化show view所需的所有变量(尽管我不清楚为什么不渲染'new',这显然是用户从哪里导航的) 。要做到这一点,可以将show方法的所有内容移动到另一个方法,并从show和show方法中调用该方法。

def initialize_show_vars 
    @user = User.find(params[:id]) 
    @current_user = current_user 
    if user_signed_in? 
     @message = current_user.messages.build 
     @pub_message = current_user.pub_messages.build 
    end 
    @feed_items = @user.feed.paginate(page: params[:page], per_page: 20) 
end 

def show 
    initialize_show_vars 
end 

def create 
    <stuff ...> 
    if @pub_message.save 
    <stuff ...> 
    else 
    flash[:error] = "Didn't work" 
    initialize_show_vars 
    render 'users/show' 
    end 
end 
+0

所以...我实际上不是来自pub_messages的'new'页面,而是来自用户展示模板。如果我重新初始化所有变量,是否需要将所有模板都移动到共享文件夹中? 还是有更好的方法来做到这一点?也许像渲染'新',然后重定向到用户#show? – Sasha

+0

@ Gabriel我和@Sasha遇到了同样的问题,我正在考虑做你的建议,但看起来有点毛茸茸。这是最佳做法吗?在我看来,它比使用'redirect_to'好,因为它会失去'@ pub_message.errors',我喜欢一直寻找'.errors'来验证错误,而不是'flash'或'session',但它仍然看起来很尴尬。如果'render'实际上被称为动作,我们可以很好地去,但是我发现在其他情况下这可能会有问题。 –