2014-12-01 2 views
0

У меня RoR 4.2.0beta. (Хотя это не имеет значения, так как это проблема начала).. Ошибка формы/контроллера

Моя форма не включает в базу данных «propuneres», которые я создаю через нее. И в результате они не отображаются на индексной странице, когда я перенаправляюсь на нее. Они появляются, когда я создаю их через консоль.

class PropuneresController < ApplicationController 

before_action :prop_params 

def new 
    @user = User.find(params[:user_id]) 
    @propunere = @user.propuneres.build 



end 

def create 
    @user= User.find(params[:user_id]) 
    @propunere = @user.propuneres.new(params[:prop_params]) 
    @propunere.save 
     if @propunere.empty? 
      render 'new' 

     else 
     redirect_to user_propuneres_path  
     end 
end 


def index 
    @user = User.find(params[:user_id]) 
    @propunere = @user.propuneres(params[:prop_params]) 
end 


private 

    def prop_params 
    params.require(:propunere).permit(:titlu, :body) 
    end 


end 

new.html.erb

<h2> Propunere Nouă </h2> 

<%= form_for @propunere do |f| %> 
    <ul> 
    <% @propunere.errors.full_messages.each do |error| %> 
    <li><%= error %></li> 
    <% end %> 
    </ul> 


    <p> 
    <%= f.label :titlu %><br /> 
    <%= f.text_field :titlu %> 
    </p> 
    <p> 
    <%= f.label :body %><br /> 
    <%= f.text_area :body %> 
    </p> 


    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 

index.html.erb

<h2> Propuneri: </h2> 

<% @propunere.each do |p| %> 
    <%= p.titlu %> 
    <%= p.body %> 
    <% end %> 
+2

Я настоятельно рекомендую назвать классы/методы/переменные и т. Д. На английском языке. Что еще хуже, вы смешали английское имя класса 'User' с румынским именем класса« Propunere »в одном приложении. –

+0

Я буду помнить об этом. Правильно, это не похоже на того, кто не понимает, что английский поглядит на мой код. Я сделал это бессмысленно недоступным. – user3260475

ответ

1

Я клонировал свой repo, вот проблема: в new.html.erb вы имели

 

<%= form_for @propunere, url: new_user_propunere_path(@user, @propunere), html: { method: :get } do |f| %> 

Оба URL и методы неправы. user_propuneres_path предоставит вам правильный URL-адрес для действия create, а правильный метод - :post, а не :get. Вот почему вы никогда не достигли действия create.

Вам также необходимо изменить с @propunere = @user.propuneres.new(params[:propunere]) на номер @propunere = @user.propuneres.new(prop_params), иначе вы получите исключение ActiveModel::ForbiddenAttributesError.

Вы можете увидеть все маршруты в приложении, запустив rake routes в терминале.

+1

Спасибо. Вероятно, вы имеете в виду рейк-маршруты? : P – user3260475

+0

Да, вы правы. – PoloniculMov

0

Я не думаю, что вам нужно Params в указательным действия:

@propunere = @user.propuneres 

, и было бы логичнее написать его во множественном числе, поскольку у вас их много.


Edit:

Как Avdept предложил ваш создавать действия должны выглядеть следующим образом:

def create 
    @user = User.find(params[:user_id]) 
    @propunere = @user.propuneres.new(prop_params) 
    respond_to do |format| 
    if @propunere.save 
     format.html { redirect_to user_propuneres_path(@user), notice: 'Your propunere has been saved' } 
    else 
     format.html { render :new } 
    end 
    end 
end 
+0

yup. Благодарю. Проблема все еще там. : P – user3260475

+0

Да, ответы об ошибках показывают, что сломано в твоем действии. – bTazi

+0

Я отредактировал свой ответ, попробую это и скажите, если это сработает. – bTazi

2

Не уверен, что, если его отношение, но у вас есть код

@propunere.save 
     if @propunere.empty? 
      render 'new' 

     else 
     redirect_to user_propuneres_path  
     end 

объект @prorunere никогда не будет пустым, так как у вас есть @propunere = @user.propuneres.new, который assigneds user_id к вашему @propunere объекту и render 'new' никогда не будут оказаны, поэтому вы не видите какие-либо ошибки проверки и не узнать, почему ваш рекорд не было создан

Кроме того, поскольку у вас есть этот кусок кода, и не видите ошибки это то, что больше всего нравится сломал код

@user.propuneres.new(params[:prop_params]) - вы должны использовать свой допускаемый Params, так что бы выглядеть

@propunere = @user.propuneres.new(prop_params)

+0

точка хорошо взята. внесла изменения. Проблема в том, что вы все еще там. Спасибо – user3260475

+0

Можете ли вы опубликовать консольный журнал здесь? Для вашего действия для создания – Avdept

+0

Я думаю, что он пропускает действие create, так как я не мог найти его в журнале. (правда, что это мой первый раз там) я нашел действие индекса где я перенаправляюсь после отправки формы - это проблема? Начато GET "/ users/10/propuneres? Utf8 =% E2% 9C% 93 & propunere% 5Btitlu% 5D = Test22 & propunere% 5Bbody% 5D = Foo + xd & commit = Создать + Propunere" для :: 1 на 2014-12-01 17: 07:43 +0200 Обработка индексом PropuneresController # как HTML Параметры: {"utf8" => "✓", "propunere" => {"titlu" => "Test22", "body" => "Foo xd" }, «commit» => «Create Propunere», «user_id» => «10»} Part2 ниже – user3260475

0

у вас есть любые проверки для модели Propunere? Возможно, модель недействительна. Вы можете использовать метод create! вместо create для тестирования, поскольку он будет генерировать исключение, если объект не может быть сохранен. Также попробуйте puts @propunere.inspect, прежде чем продолжать его и убедитесь, что содержимое объекта в порядке, выход будет отображаться в журнале разработки.

+0

Нет утверждений. only принадлежит_to: пользователь. Он полностью игнорирует действие create. Я попытался, само действие отсутствует в журнале. Я также попробовал bind.pry с pry gem, и он не добирается до него. – user3260475

Смежные вопросы