尝试创建个人资料表单,用户可以在其中将有关其兴趣爱好的信息添加到用户个人资料中。但是在尝试这样做时我收到以下错误。
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
答案 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
模型中设置setter
和User
这将使Rails能够填充hobbies
的{{1}}属性。但是,数据不会持久,因为它只会在模型中基于 per-instance 设置,这意味着当您刷新页面等时它将丢失
使用上面的代码可以让您的表单正常工作,无论您是否使用Rails 3或4。
<强>模型强>
Rails是着名的MVC框架 - 这意味着它有3个核心组件 - Model
(从数据库构建数据),models
(为视图配置数据)&amp; controllers
(显示来自控制器和型号的数据)。
当您加载Rails应用程序时,您正在发送请求,这将路由发送到特定的控制器操作。然后,它将调用数据库中的数据,允许您在视图中操作它。
因此,必须从您的数据库中填充 views
。他们通过获取数据表中的各种属性并为它们创建一系列getters and setters
来实现此目的。这些使您能够访问属性中的数据,或设置新的数据。
您的错误发生是因为您没有在数据表中设置相关属性。您需要create a migration将Models
属性添加到hobbies
模型中:
User
迁移应该创建类似:
> $ rails g migration AddHobbiesToUser hobbies:string
> $ rake db:migrate