2016-01-06 69 views
1

我對軌道非常陌生,並且正在網上商店工作,只是爲了編寫一些軌道。我有一個評論表單,需要一個隱藏字段來傳遞產品ID。出於某種原因,我無法訪問表單中的「產品」實例變量。Rails - 無法以形式訪問實例變量

的形式爲:

<%= form_for @comment, remote: true do |f| %> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    <%= f.label :comment %> 
    <%= f.text_area :comment %> 
    <%= f.label :rating %> 
    <%= f.text_field :rating, value: 5 %> 
    <%= f.hidden_field :product_id, :value => @product.id %> 
    <%= f.button :submit %> 
<% end %> 

我呈現形式與new.js.erb文件:

$('#comment-form').html("<%= j (render 'layouts/review_form') %>"); 
$('#comment-form').slideDown(350); 

這是扳機連桿和DIV:

<%= link_to 'Write a review', new_comment_path, remote: true %> 
<div id="comment-form" style="display:none;"></div> 

當我擺脫hidden_​​field時,一切都像其假設的t OO。有任何想法嗎?

謝謝:)

+0

你能告訴我們什麼樣的錯誤你得到時hidden_​​field線是否存在?你還可以在這個問題中添加導致表單呈現的動作(在控制器中)嗎?謝謝! – ConnorCMcKee

+0

這是錯誤:ActionView :: Template :: Error(對於nil:NilClass,未定義的方法'id'): 我的控制器只包含索引,新建和創建方法,沒有其他 –

+1

所以這可能是New action ,對嗎?在這種情況下,您需要確認New操作定義了產品(它向您提供的原因是該產品未針對與此視圖對應的操作進行定義)。 – ConnorCMcKee

回答

3

在Rails中,一個實例變量是在這使得該視圖中的動作定義爲僅當查看可用的。例如,如果我們現在正在查看comments/new.html.erb文件,則需要在comments_controller.rb的「新」操作中同時定義@comment和@product。所以,現在,想必你的行動看起來是這樣的:

def new 
    @comment = Comment.new 
end 

現在要訪問@product,你必須有識別產品@product的一種方式。我不知道你打算怎麼做,但如果我們想象product_id是一個參數,這是行得通的。

def new 
    @comment = Comment.new 
    @product = Product.find(params[:product_id]) 
end 

我必須想象你還沒有那個參數,但這基本上是在控制器中必須完成的。

另一種選擇一些場景是使用@comment和@product之間的關係來訪問@ comment.product.id在視圖中,但不會在這種情況下工作,因爲你是定義一個新的據推測,該評論尚未包含對產品的引用。

+0

我明白了!非常感謝!非常感謝:) –

+0

@保羅你很歡迎!如果您需要進一步的幫助來學習如何在控制器中傳遞/訪問參數,請不要猶豫。也就是說,這可能會成爲您的有用資源: http://guides.rubyonrails.org/action_controller_overview.html#parameters – ConnorCMcKee

+0

謝謝。將調查它 –

1

要添加到@ConnorCMcKee的答案,您需要使用nested resource而不是設置隱藏字段。我儘可能地避開隱藏的字段(太容易操作)。

你會更好:

#config/routes.rb 
resources :products do 
    resources :comments #-> url.com/products/:product_id/comments/new 
end 

這通過你的路線,而不是形式設置params[:product_id]變量。這可能似乎不是安全的,但要給人更多的語義呼籲:

<%= link_to 'Write a review', new_product_comment_path(@product), remote: true %> 

其他的一切將正常運行是(與@ConnorcMcKee's答案)

+0

謝謝,我會研究。 –