Ruby on Rails表单带有可选字段

时间:2016-05-03 19:29:57

标签: ruby-on-rails ruby

我正在尝试使用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>)>

2 个答案:

答案 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

这应该确保:响应列是正确创建的。

这样的迁移文件允许您在项目的生命周期中对数据库模式进行增量更改。使用迁移添加或删除列,更改列属性(名称,可空,大小等),添加或删除索引,甚至添加或删除表。您通常至少拥有其中的一部分,如果您拥有更大的项目,可能会有很多。