ActionView :: Template :: Error(#user:0x007f80045ca0e0>的未定义方法`stage')</user:0x007f80045ca0e0>

时间:2014-07-14 14:37:30

标签: ruby-on-rails ruby ruby-on-rails-4

我在视图中遇到表单错误,无法理解为什么会发生这种情况。我一直在ActionView::Template::Error (undefined method 'stage' for #<User:0x007f80045ca0e0>)

我有两个模型,User和Stage。用户has_many分阶段,并向用户分阶段belongs_to。它如下

舞台模型:

class Stage < ActiveRecord::Base
    belongs_to :user
end

用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
    devise  :database_authenticatable, :registerable,
            :recoverable, :rememberable, :trackable, :validatable

    has_one :user_setting       
    has_many :matches,      dependent: :destroy 
    has_many :stages,   dependent: :destroy 

end

在用户控制器中我有以下内容:

class UsersController < ApplicationController

    def show
        @newMatch = current_user.matches.new
        @newStage = current_user.drivepipes.new
    end

end

和show.html.erb上的表单

<%= form_for [current_user], url: user_stages_path(current_user, @newStage) do |s| %>

    <%= s.text_field :stage,                placeholder: "Stage" %>

    <%= s.submit "Save" %>

<% end %>

2 个答案:

答案 0 :(得分:0)

如果每个用户都有多个阶段并且您正在为您的用户制作表单,那么<%= s.text_field :stage, placeholder: "Stage" %>会给您一个错误,因为用户has_many :stages是可枚举的。所以你会想要像

这样的东西
<%= form_for [current_user], url: user_stages_path(current_user, @newStage) do |s| %>
  <% current_user.stages.each do |stage| %>
    <%= s.text_field stage, placeholder: "Stage" %>
  <% end %>
  <%= s.submit "Save" %>
<% end %>

假设您想要用户拥有的每个阶段的文本字段,即。也许这不是目标吗?

答案 1 :(得分:0)

User和Stage之间存在一对多的关系。因此,外键将驻留在Stage表中,即user_id。你应该明确表示你不能拥有一个属性阶段&#39;或如果User对象有多个阶段,则为stage_id。但是Rails有帮手:

@user.stages 

将使用query:

返回已使用此用户ID保存的阶段数组
select * from stages where stages.user_id = @user.id

虽然:

@user.stage

会引发错误。

如果您想获取与当前用户关联的新创建的舞台对象的输入,您查看的代码应如下所示:

<%= form_for current_user, url: user_stages_path(current_user, @newStage) do |user_form| %>

    <%= user_form.fields_for @newStage do |stage| %>
      <%= stage.text_field :stage, placeholder: "Stage" %>
    <% end %>

    <%= user_form.submit "Save" %>

<% end %>

后来,在控制器中;你可以用类似的方式得到舞台对象:

stage = Stage.new params[:user][:stage]