【问题标题】:Rails Form Not Updating the AttributesRails 表单不更新属性
【发布时间】:2015-04-22 07:44:23
【问题描述】:

这是定义表单的正确方法吗,如果我需要提供更多详细信息,请告诉我。

这是 new.html.erb 中的 UserPreference 表单

<%= form_for :user_preference, url: user_preferences_path do |u|%>
     <p>
        <%= u.label :title %><br>
        <%= u.text_field :title %>
      </p>

      <p>
        <%= u.label :description %><br>
        <%= u.text_field :description %>
      </p>

      <p> <%= u.label :back_ground_color %><br>
        <select name="bgcolor" id="bgcolor">
            <option value="#FF3300">Orange</option>
            <option value="#00FF00">Green</option>
            <option value="#0000FF">Blue</option>
            <option value="#FF0066">Pink</option>
            <option value="#FFFF00">Yellow</option>
            <option value="#FFFFFF">White</option>
        </select>
      </p>

      <p>
        <%= u.label :font %><br>
        <select name="font" id="font">
            <option value="Times New Roman">Times new Roman</option>
            <option value="Verdana">Verdana</option>
            <option value="Arial">Arial</option>
            <option value="sans-serif">serif</option>
        </select>
      </p>

     <br >
      <p>
        <%= u.submit %>
      </p>

当我尝试在 html 中呈现时,我得到了标题和描述, 该属性未在数据库中更新。

UserPreference.controller.rb

class UserPreferencesController < ApplicationController
    def new
        @user_preference = UserPreference.new
    end

    def create
        @user_preference = UserPreference.new(userp_params)
        @user_preference.save unless user_signed_in?
        render plain: params[:user_preference].inspect
    end
    def edit
    end
    def update
    end

    private
    def userp_params
        params.require(:user_preference).permit(:title, :bgcolor, :font, :description)
    end
end

【问题讨论】:

  • 不,它仍然没有在参数中更新,无论我在表单中提供选项值时是否遗漏了任何内容
  • 人们忙着为这个问题投票,但他们无法回答这个问题
  • 检查你是否获得了控制器中的所有参数
  • @user120 我可以在 Rails 控制台中看到所有值都在更新,但是当我尝试在控制器中将其呈现为普通哈希时,它只显示标题和描述,我无法更新数据库还有
  • @cyborg 您正在投票,因为您的问题似乎是“这是您定义表单的方式”。你实际上只是在问题的中途潜入真正的问题。你需要让你的实际问题更加突出。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


【解决方案1】:

当你这么说时

<%= u.text_field :description %>

因为您正在使用 :user_preference,所以它会输入类似

<input type="text" name="user_preference[description]" value="foo">

(其中 'foo' 是当前值,或者可能是空白)

注意“名称”属性:这将进入参数,如

params = {:user_preference => {:description => "foo"}}

如果您要手动编码选择,那么您需要确保名称属性也具有这种结构,例如

 <select name="user_preference[bgcolor]" id="bgcolor">

所以你会得到像

这样的参数
params = {:user_preference => {:description => "foo", :bgcolor => "#FFFFFF"}}

然后允许你说

@user_preference.attributes = params[:user_preference]

这是在控制器中处理此问题的标准方法。

但是,与其为选择写出所有 html,不如使用 rails 表单助手(在本例中为select),就像使用文本字段一样。您还可以使用 options_for_select 帮助器定义选择的选项,这样也可以节省大量输入。

 <%= u.select :bgcolor, options_for_select([["Orange", "#FF3300"], ["Green", "#00FF00"], ["Blue", "#0000FF"], ["Pink", "#FF0066"], ["Yellow", "#FFFF00"], ["White", "#FFFFFF"]]) %>

在代码中的某个地方定义这个选项变量也更简洁,例如在 UserPreference 类方法中:

class UserPreference < ActiveRecord::Base

  #class methods section
  class << self

    def bgcolor_options
      [["Orange", "#FF3300"], ["Green", "#00FF00"], ["Blue", "#0000FF"], ["Pink", "#FF0066"], ["Yellow", "#FFFF00"], ["White", "#FFFFFF"]]
    end
  end
end

现在你可以像这样使用选择了:

 <%= u.select :bgcolor, options_for_select(UserPreference.bgcolor_options) %>

http://guides.rubyonrails.org/form_helpers.html#the-select-and-option-tags

【讨论】:

  • 您能否在最后一行添加等于登录表单标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多