form_for中的自定义字段

时间:2014-08-27 05:48:36

标签: ruby-on-rails ruby forms

尝试创建个人资料表单,用户可以在其中将有关其兴趣爱好的信息添加到用户个人资料中。但是在尝试这样做时我收到以下错误。

    NoMethodError in Users#edit_profile

    undefined method `hobbies' for #<User:0x007ff1a8a1f198>

有谁知道问题可能是什么,还是潜在的解决方案?我是rails的新手,但我的印象是'text_field'是一个安全的选择,可以让任何自定义输入工作。安装强参数gem会不会有帮助呢?

edit_profile.html.erb

<h2>Tell us about yourself</h2>

<%= form_for @user do |f| %>

    <%= f.label :first_name %><br />
    <%= f.text_field :first_name, autofocus: true %>

    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>

    <%= f.label :hobbies %><br />
    <%= f.text_field :hobbies %>

  <div><%= f.submit "Update" %></div>
<% end %>

user_controller.rb

class UsersController < ApplicationController
  before_filter :authenticate_user!
    def index
      @users = User.all
    end

    def show
      @user = User.find(params[:id])
    end

    def new
      @user = User.new
    end

    def create
    end

    def edit
    end

    def update
      @user = User.find(params[:id])
      @user.update!(user_params)
      redirect_to @user
    end

    def destroy
    end

    def edit_profile
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :hobbies)
    end

end

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :hobbies

  #validates :first_name, presence: true, length: { maximum: 50 }
  #validates :last_name, presence: true, length: { maximum: 50 }

end

2 个答案:

答案 0 :(得分:1)

你没有提到它,但我会假设你正在运行Rails 4.x.

Rails 4.x引入了strong parameters,因此在您的控制器中,您需要添加一个私有方法来设置允许的参数,并从模型中删除attr_accessible

所以在你的情况下它将是:

 def user_params
    params.require(:first_name, :last_name).permit(:email, :password, :password_confirmation, :remember_me, :hobbies)
  end

如果您仍然无法理解这个概念,或者来自之前的Rails版本,请查看this blog post

答案 1 :(得分:0)

  

有谁知道问题可能是什么,还是潜在的解决方案?

当然 - 问题是您的hobbies模型中没有User属性:)

既然你是新手,我会在回答问题之后解释一下Rails。但是,让我解释一下创建正确属性的价值:

#app/models/user.rb
class User < ActiveRecord::Base
   attr_accessor :hobbies
end

这是您为User模型创建单个属性所需的内容。 attr_accessor指令是一个Ruby方法,它在getter模型中设置setterUser

这将使Rails能够填充hobbies的{​​{1}}属性。但是,数据不会持久,因为它只会在模型中基于 per-instance 设置,这意味着当您刷新页面等时它将丢失

使用上面的代码可以让您的表单正常工作,无论您是否使用Rails 3或4。


<强>模型

Rails是着名的MVC框架 - 这意味着它有3个核心组件 - Model(从数据库构建数据),models(为视图配置数据)&amp; controllers(显示来自控制器和型号的数据)。

当您加载Rails应用程序时,您正在发送请求,这将路由发送到特定的控制器操作。然后,它将调用数据库中的数据,允许您在视图中操作它。

因此,必须从您的数据库中填充

views。他们通过获取数据表中的各种属性并为它们创建一系列getters and setters来实现此目的。这些使您能够访问属性中的数据,或设置新的数据。

您的错误发生是因为您没有在数据表中设置相关属性。您需要create a migrationModels属性添加到hobbies模型中:

User

迁移应该创建类似:

> $ rails g migration AddHobbiesToUser hobbies:string
> $ rake db:migrate