我开始在我的rails应用程序中使用decent_exposure,并且在尝试更新记录时遇到问题。我明白了:
NoMethodError in Frontend::UsersController#update
undefined method `attributes=' for nil:NilClass
Around line 22:
def update
if user.save (line 22)
redirect_to user_path(user.username)
else
render :edit
我的控制器:
class Frontend::UsersController < Frontend::FrontendController
expose(:user, finder: :find_by_username, finder_parameter: :username, attributes: :user_params)
def create
if user.save
redirect_to user_path(user.username)
else
render :new
end
end
def update
if user.save
redirect_to user_path(user.username)
else
render :edit
end
end
private
def user_params
params.require(:user).permit(:firstname, :lastname, :email, :username, :birthday)
end
end
我的FrontentController目前只有< ApplicationController
。
在app控制器中:
decent_configuration do
strategy DecentExposure::StrongParametersStrategy
end
所以我已经完成了decent_exposure gem所需要的所有功能,在create方法中保存用户不会产生任何问题。如果我将save
更改为update
,我会再次收到同样的错误。知道为什么它没有从expose方法调用中获取我的user_params吗?
修改
我添加了我的视图部分:
= form_for user do |f|
- if user.errors.any?
%ul
= list_of user.errors.full_messages do |error|
= error.humanize
%div
%p= f.label :firstname
%p= f.text_field :firstname
%div
%p= f.label :lastname
%p= f.text_field :lastname
%div
%p= f.label :email
%p= f.text_field :email
%div
%p= f.label :username
%p= f.text_field :username
%div
%p= f.label :birthday
%p= f.text_field :birthday
%div= f.submit
进行了更多挖掘后,编辑操作似乎是update/:id
而不是update/:username
。我可以通过将URL作为user_path(user.username)
传递,在编辑表单中解决这个问题(如果我将其从部分中删除)。这引出了另一个问题:如果我使用实例变量@user
我可以form_for @user do |f|...
,它会为我选择正确的路线,但我必须明确地传递user.username
作为使用decent_exposure的user_path
路由生成器的参数。为什么是这样?或者我错过了什么?
答案 0 :(得分:0)
好的,事实证明使用decent_exposure不会改变对有问题的模型覆盖to_param
的要求。快点:
def to_param
username
end
在user.rb中一切都很好。经验教训!