我正在尝试使用text_field表单帮助程序,但它无法正常工作。这是我的表格
<%= form_for @score do |f| %>
<%= f.hidden_field :site_id %>
<%= f.select(:value, (1..10).to_a) %>
<%= f.text_field :response %>
<%= f.submit "Submit" %>
<% end %>
当我在本地运行时,我得到:response
的NoMethodError。 Response
是我刚刚添加的score
的属性,因此可能存在问题。
这就是我score_controller
目前的样子
def create
@score = Score.create(score_params)
respond_with @score
end
def new
@score = Score.new(site: Site.find(params['site_id']))
end
private
def score_params
params.require(:score).permit(:value, :response, :site_id)
end
现在response
不会是必填字段,用户可以根据需要将响应留空。或者至少这就是我想要它的样子。我是铁杆的新手;这是我使用它的第一个项目。
由于
编辑:这是我的分数表,以及错误
create_table "scores", force: :cascade do |t|
t.integer "value", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "site_id"
t.string "response"
end
错误:
NoMethodError at /scores/new
undefined method `response' for #<Score:0x007ff293567790>
Did you mean? respond_to?
Edit2:在rails控制台中创建新分数
s = Score.new
=> #<Score:0x007fbec9001448 id: nil, value: nil, created_at: nil, updated_at: nil, site_id: nil, response: nil>
Edit3:@score from new
action
[1] pry(#<ScoresController>)> @score.inspect
=> "#<Score id: nil, value: nil, created_at: nil, updated_at: nil, site_id: 130>"
[2] pry(#<ScoresController>)>
答案 0 :(得分:1)
可能rails会捕获自己的响应对象,尝试重命名它。 response_score
<%= form_for @score do |f| %>
<%= f.hidden_field :site_id %>
<%= f.select(:value, (1..10).to_a) %>
<%= f.text_field :response_score %>
<%= f.submit "Submit" %>
<% end %>
<强>控制器:强>
def create
@score = Score.create(score_params.merge(response: params[:score][:response_score]))
respond_with @score
end
private
def score_params
params.require(:score).permit(:value, :site_id)
end
答案 1 :(得分:1)
您提到刚刚添加了:response
,但scores
表的迁移显示:response
没有其他迁移。
new
的返回值也表明对象中没有response
,因此进一步表明response
列实际上从未创建过。
鉴于您已经为scores
表迁移显示了什么,看起来您遇到了迁移定义问题。添加新数据库列的正确方法是创建后续迁移,如下所示:
rails generate migration AddResponseToScores
完成后,您应该在db / migrate中有一个新的迁移文件。编辑此文件,如下所示:
class AddResponseToScores < ActiveRecord::Migration
def change
change_table :scores do |t|
t.string :response, limit: 1000, null: true
end
end
end
请注意,我添加了limit
限定符(允许您限制列大小)并使null
限定符显式,这有助于自我记录代码的意图。我发现,如果你正在建立一个真实的&#39;应用程序,这些对维护者来说很重要;但是,您可以根据需要随意省略它们。
编辑完成后,您可以运行迁移,如下所示:
rake db:migrate
如果成功,我还运行回滚方法,然后再次迁移,只是为了确保在部署问题时没有回滚问题。您可以使用以下命令回滚迁移:
rake db:rollback
这应该确保:响应列是正确创建的。
这样的迁移文件允许您在项目的生命周期中对数据库模式进行增量更改。使用迁移添加或删除列,更改列属性(名称,可空,大小等),添加或删除索引,甚至添加或删除表。您通常至少拥有其中的一部分,如果您拥有更大的项目,可能会有很多。