2012-06-04 43 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'實際上被稱爲動作,我們可以很好地去,但是我發現在其他情況下這可能會有問題。 –