.each循环返回[]。表格/控制器问题

时间:2014-12-01 13:09:25

标签: ruby-on-rails

我有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 %>

4 个答案:

答案 0 :(得分:2)

不确定是否相关,但您有代码

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

        else 
        redirect_to user_propuneres_path    
        end

对象@prorunere将永远不会为空,因为你有 @propunere = @user.propuneres.new,为您的user_id对象分配了@propunere 永远不会呈现render 'new',因此您不会看到任何验证错误,也永远不会发现您的记录未创建的原因

此外,由于您拥有该段代码,并且没有看到错误,这就是最喜欢破坏您的代码

@user.propuneres.new(params[:prop_params]) - 你应该使用你允许的参数,所以它看起来像

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

答案 1 :(得分:1)

我克隆了你的repo,问题就出现了:new.html.erb你有


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

网址和方法都是错误的。 user_propuneres_path会为您提供创建操作的正确网址,正确的方法为:post,而不是:get。这就是您从未达到create行动的原因。

您还需要从@propunere = @user.propuneres.new(params[:propunere])更改为@propunere = @user.propuneres.new(prop_params),否则您将获得ActiveModel::ForbiddenAttributesError例外。

您可以通过在终端中运行rake routes来查看应用中的所有路线。

答案 2 :(得分:0)

我认为您的索引操作中不需要参数:

@propunere = @user.propuneres

因为你有许多这样的文字,所以将它写成复数更合乎逻辑。

<小时/> 编辑:

正如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

答案 3 :(得分:0)

您对Propunere模型有任何验证吗?也许模型无效。您可以使用 用于测试的create!方法而不是create,因为如果无法保存对象,它将抛出异常。在持久化之前尝试puts @propunere.inspect并检查对象的内容是否正常,输出将显示在开发日志中。