我有用户,每个用户设置一个目标。因此,目标属于用户和用户has_one:目标。我试图在视图中使用form_for以允许用户设置他们的目标。
我认为它就像微博(直接来自Hartl的教程),只是用单数而不是复数。我已经在这里查看了关于这个问题的教程和问题,并尝试了很多不同的东西,但我无法让它发挥作用。
我得到了form_for实际工作并显然指向正确的路线,但我得到了以下错误,我不知道这意味着什么:
未定义的方法`stringify_keys'为"减肥":字符串
GoalsController
class GoalsController < ApplicationController
before_filter :signed_in_user
def create
@goal = current_user.build_goal(params[:goal])
if @goal.save
redirect_to @user
end
end
def destroy
@goal.destroy
end
def new
Goal.new
end
end
目标模型
class Goal < ActiveRecord::Base
attr_accessible :goal, :pounds, :distance, :lift_weight
belongs_to :user
validates :user_id, presence: true
end
用户模型
class User < ActiveRecord::Base
has_one :goal, :class_name => "Goal"
end
_goal_form(这是用户#show的模态)
<div class="modal hide fade in" id="goal" >
<%= form_for(@goal, :url => goal_path) do |f| %>
<div class="modal-header">
<%= render 'shared/error_messages', object: f.object %>
<button type="button" class="close" data-dismiss="modal">×</button>
<h3>What's Your Health Goal This Month?</h3>
</div>
<div class="modal-body">
<center>I want to <%= select(:goal, ['Lose Weight'], ['Exercise More'], ['Eat Better']) %> </center>
</div>
<div class="modal-body">
<center>I will lose <%= select_tag(:pounds, options_for_select([['1', 1], ['2', 1], ['3', 1], ['4', 1], ['5', 1], ['6', 1], ['7', 1], ['8', 1], ['9', 1], ['10', 1]])) %> lbs. this month!</center>
</div>
<div class="modal-footer" align="center">
<a href="#" class="btn" data-dismiss="modal">Close</a>
<%= f.submit "Set Goal", :class => "btn btn-primary" %>
</div>
<% end %>
</div>
的routes.rb
resource :goal, only: [:create, :destroy, :new]
答案 0 :(得分:1)
试试这个
# in your user model
accepts_nested_attributes_for :goal
在您的用户模型中编写上述代码,
for select tag尝试使用此链接
http://shiningthrough.co.uk/Select-helper-methods-in-Ruby-on-Rails
答案 1 :(得分:1)
我希望stringify_keys
错误与你在目标字段中列出选项的方式有关,它们需要分组才能被视为一个参数。
除了使用Dipak建议的accepts_nested_attributes_for :goal
之外,您还需要一个嵌套表单。
form_for @user do |form|
fields_for @goal do |fields|
fields.select :goal, ['Lose Weight', 'Exercise More', 'Eat Better']
保存操作现在位于用户的上下文中,因此通过的属性将包含目标字段的一部分:
user =>{goal_attributes => {:goal => 'Eat Better'}}
您可以通过更新用户来保存这些属性:
@user.update_attributes(params[:user])
顺便说一句,你的“新”操作应该是@goal = Goal.new
,只是创建一个新目标什么也不做,你需要将它分配给一个变量才能使它进入页面。