我在视图中遇到表单错误,无法理解为什么会发生这种情况。我一直在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 %>
答案 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]