【问题标题】:rails render missing variablesrails 渲染缺失的变量
【发布时间】:2012-06-04 20:02:52
【问题描述】:

对于我的 rails 应用程序,我的错误消息显示不正确。我认为原因是因为验证失败,我的控制器做了重定向而不是渲染。但是,我无法渲染。我所有的变量似乎都不见了。例如在我的 pub_messages#create 我有...

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

^(顺便说一句,由于某些安全问题,我会保存每个属性,所以我没有制作:to_id attr_accessible)

但回到正题,当我渲染“用户/节目”时,它似乎找不到我的任何变量。它进入我的用户显示视图,抱怨......

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

但是,如果它发生在我的 users#show 操作中,我声明了@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

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

更新:所以它似乎没有进入表演动作。我该如何解决不显示的错误消息?如果我进行重定向,是否会导致浏览器立即请求新页面?因此我的错误消息永远不会出现?

UPDATE2:所以...我实际上不是来自模型的“新”页面,而是来自用户显示模板。在模板中,我有以下内容

<%= 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#create。如果我确实重新初始化了所有变量,我是否还需要将所有模板移动到共享文件夹中,因为它会抱怨这一点。

或者有没有更好的方法来做到这一点?也许就像渲染“新”,然后重定向到用户#show?

【问题讨论】:

    标签: ruby-on-rails render nomethoderror


    【解决方案1】:

    重定向将显示 Flash 消息,但不会显示验证错误。由于您没有设置 Flash 错误消息,我猜您想显示模型的验证错误。为此,您需要坚持渲染,而不是重定向。

    为了渲染,您需要初始化显示视图所需的所有变量(尽管我不清楚您为什么不渲染“新”,这表面上是用户导航的地方)。要干净利落地执行此操作,您可以将 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
    

    【讨论】:

    • 所以...我实际上不是来自 pub_messages 的“新”页面,而是来自用户显示模板。如果我确实重新初始化了所有变量,我是否还需要将所有模板移动到共享文件夹中?还是有更好的方法来做到这一点?也许就像渲染“新”,然后重定向到用户#show?
    • @Gabriel 我遇到了与@Sasha 相同的问题,我正在考虑按照您的建议进行操作,但这似乎有点麻烦。这是最佳做法吗?在我看来,这比使用redirect_to 更好,因为那样会失去@pub_message.errors,而且我喜欢始终使用.errors 来查找验证错误而不是flashsession,但它看起来仍然很尴尬。如果render 真的调用了该操作,我们会很高兴,但我知道这在其他情况下可能会出现问题。
    【解决方案2】:

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

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

    试试redirect_to :controller =&gt; :users, :action =&gt; :show, :id =&gt; current_user.id,而不是render 'users/show'

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

    这有帮助吗?

    【讨论】:

    • 哦,我是通过帖子编辑的。不重定向不显示验证失败?
    • 您的问题是与 nil:NilClass` 的 undefined method name' 相关还是未显示消息?
    • 如果我取出渲染并进行重定向,则消息不会显示
    • Flash 有三种风格:flash、flash.now 和 flash.keep。尝试/研究这些。
    • hmmm 可以和你聊天吗?
    【解决方案3】:

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

    您可以尝试另一个重定向而不是呈现模板。

    【讨论】:

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