2

对于我的 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?

4

3 回答 3

3

重定向将显示 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
于 2012-06-05T03:04:51.330 回答
2

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

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

而不是render 'users/show',尝试redirect_to :controller => :users, :action => :show, :id => current_user.id

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

这有帮助吗?

于 2012-06-04T20:09:18.257 回答
0

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

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

于 2012-06-04T20:06:10.897 回答