2013-07-02 5 views
1

Я только что сделал rails g scaffold Feedback feedback:string user_id:integer. Когда я перехожу к 0.0.0.0:3000/feedbacks/new, все работает отлично. Но когда я пытаюсь поместить форму обратной связи внутри модальной, я получаю эту ошибку: undefined method "model_name" for NilClass:Class. Я столкнулся с проблемой, но не могу найти решение, которое работает.Rails: undefined method `model_name 'для NilClass: Class

Кто-нибудь знает, что может быть решением этого?

обратные связи/_form.html.erb (я использую simple_form)

<%= simple_form_for(@feedback) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :feedback %> 
    <%= f.input :user_id %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

обратные связи/new.html.erb

<h1>New feedback</h1> 
<%= render 'form' %> 
<%= link_to 'Back', feedbacks_path %> 

обратные связи/_feedback_modal.html.erb

<div id="activate_feedback_modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-body"> 
     <%= render "feedbacks/form" %> 
    </div> 
</div> 

feedbacks_controller.rb (new и create действие)

class FeedbacksController < ApplicationController 
    def new 
    @feedback = Feedback.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @feedback } 
    end 
    end 

    def create 
    @feedback = Feedback.new(params[:feedback]) 

    respond_to do |format| 
     if @feedback.save 
     format.html { redirect_to @feedback, notice: 'Feedback was successfully created.' } 
     format.json { render json: @feedback, status: :created, location: @feedback } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @feedback.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
end 

lelist.html.erb (где я сделать модальный)

<div class="lelist_body"> 
<div class="container" id="dk"> 
    <% if current_user %> 
     <div class="row"> 
      <div class="span6 offset3" id="user_post_area_button"> 
       <a class="big_fat_feedback_button" href="#activate_feedback_modal" data-toggle="modal">feedback</a> 
      </div> 
     </div> 
    <% end %> 
    <%= render 'pages/singlePost' %> 
</div> 
<div class="row"> 
    <div class="span6 offset3"> 
     <%= will_paginate @posts %> 
    </div> 
</div> 
</div> 

<%= render "feedbacks/feedback_modal" %> 
+0

Где вы оказываете модальный? Вероятно, '@ feedback' недоступен из модального вида, поэтому это' nil'. 'form_helper' пытается сгенерировать url из класса' nil', который является 'nilClass' и не имеет атрибута' model_name'. –

+0

Действие 'lelist' в вашем контроллере (которое отображает' lelist-view', имеет ли он '@feedback = Feedback.new'? –

+0

ДА! Это @Tim. Я просто добавил '@feedback = Feedback.new' к действию. Спасибо! Отправьте это как ответ, и я приму это :) (Я немного новичок в рельсах, не могли бы вы дать короткое объяснение или ссылку на то, где я могу прочитать, почему я должен был это делать?) , – allegutta

ответ

1

lelist действия в контроллере, при наличии которого lelist вида должен иметь:

@feedback = Feedback.new 

Вот почему:

Перед тем, как создать форму, в этом случае для «обратной связи» , вам необходимо создать новый экземпляр этой модели: (@feedback = Feedback.new)

Форма генерируется со всеми атрибутами этого экземпляра.

URL-адрес маршрута к действию на контроллере и отображает вид оттуда. Таким образом, действие, которое отображает страницу с модальным, должно быть всегда создать этот новый экземпляр модели.

Надеюсь, это делает его более понятным, трудно объяснить такую ​​простую вещь.Наиболее важным является:

Каждая переменная, которую вы используете в представлении, должна быть создана в действии, которое отображает это представление.

+0

Еще раз спасибо за разъяснение! – allegutta

0

Является ли это меня, но есть в вашем _form.html.erb следующие:

<%= simple_form_for(@feedback) do |f| %> 

Но все же в вашем контроллере class FeedbacksController < ApplicationController

Так что, когда вы звоните в свою форму и даете ей @feedback, а не @feedbacks. Кроме того, при оказании частичной это должно наиболее вероятно выглядеть следующим образом:

<%= render :partial => "form", :locals => { :feedbacks=> @feedbacks} %> 

Также взгляните на рубин на рельсы направляющей секции 3.4.4 - Passing Local Variables

1

Вы должны определить @feedback в действии контроллера, где вы называете покадрово.

0

Я думаю, он не находит переменную @feedback в вашем частичном. Так лучше передать переменную.

<%= render 'form', :feedback => @feedback%> 

В ваших обратных связей/_form.html.erb

<%= simple_form_for(feedback) do |f| %> 
Смежные вопросы