2016-12-09 164 views
1

說明:我下面的教程toy_app:https://www.railstutorial.org/book/toy_app如何使用Ruby on Rails關聯?

我有根據第帶有運動問題的問題2.3.3

問題:編輯用戶顯示頁面中顯示的內容用戶的第一個微博。 (根據文件中的其他內容,使用技術複雜性(框1.1)來猜測語法。)通過訪問/ users/1確認它的工作。

在我的app/views/users/show.html.erb文件中。我嘗試使用我的@ micropost.content對象來顯示與用戶關聯的任何內容。

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Name:</strong> 
    <%= @user.name %> 
</p> 

<p> 
    <strong>Email:</strong> 
    <%= @user.email %> 
</p> 

<p> 
    <strong>Content:</strong> 
    <%= (<%= @micropost.content %>) %> 
</p> 


<%= link_to 'Edit', edit_user_path(@user) %> | 
<%= link_to 'Back', users_path %> 

結果

NoMethodError中的用戶#表明

未定義的方法 '內容' 的零:NilClass

結論

我需要生成一個的form_for我的崗位我應用程序/視圖/用戶文件?或者,因爲我在我的microposts_controller.rb中的私有'micropost_params'方法中設置了我的:content對象,它不允許在控制器之間傳輸對象數據?

我的控制檯內測試了以下幾行代碼,以確保關聯的工作:

first_user = User.first 
first_user.microposts 
micropost = first_user.microposts.first 
micropost.user 

我覺得我需要定義,讓我進入我的用戶控制文件中的一個方法:內的內容對象我的MicroPosts班。

+1

您是否在控制器的show方法中設置了@ @ micropost變量? –

+1

它應該是'@ user.micropost.content',或者在您的控制器中導出'@micropost = User.first.microposts',並在視圖中處理數組。 – joaumg

+0

@joaumg:實際上,兩者都不會起作用。它應該是別的東西:) –

回答

1

show動作看起來應該像下面這樣。

def show 
    @user = User.find(params[:id]) 
    @micropost = @user.microposts.first 
end 

現在,在視圖中,您可以使用@micropost.content訪問micropost的內容。如果用戶沒有與他相關的微博(如果沒有寫微博)呢?在這種情況下,@user.microposts.first將是nil。如果您不確定我的意思,請嘗試在軌道控制檯中播放它。

<% if @micropost %> 
    <%= @micropost.content %> 
<% else %> 
    <p> User has no microposts </p> 
<% end %> 
+0

謝謝Arun,這很有道理。感謝你的幫助! –

+0

謝謝Arun!欣賞知識。 –

+0

@RyanAnderson不客氣。很高興我能夠提供幫助。 –