Ruby on Rails表单带有可选字段
我正在尝试使用text_field表单帮助程序,但它不起作用。 这是我的表格
当我在本地运行时,我得到一个NoMethodError :response
。 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 # Did you mean? respond_to?
Edit2:在rails控制台中创建新的分数
s = Score.new => #
Edit3:来自new
动作的@score
[1] pry(#)> @score.inspect => "#" [2] pry(#)>
也许,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
您提到您刚刚添加了:response
,但scores
表的迁移显示没有针对:response
其他迁移: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
限定符显式,这有助于自我记录代码的意图。 我发现,如果你正在构建一个“真正的”应用程序,这些对于维护者来说变得很重要; 但是,你可以随意省略它们。
编辑完成后,您可以运行迁移,如下所示:
rake db:migrate
如果成功,我还运行回滚方法,然后再次迁移,只是为了确保在部署问题时没有回滚问题。 您可以使用以下命令回滚迁移:
rake db:rollback
这应该确保正确创建:响应列。
像这样的迁移文件允许您在项目的生命周期中对数据库模式进行增量更改。 使用迁移添加或删除列,更改列属性(名称,可空,大小等),添加或删除索引,甚至添加或删除表。 您通常至少会拥有其中的一部分,如果您拥有更大的项目,可能会有很多。