关于为我正在处理的应用的特定部分构建一个宁静设计的最佳方法,我有一个问题。
应用程序的一些背景知识:
User has_one :settings_for_email
有一个profile_controller,它有一个show动作..类似于:
def show
@user = current_user
end
最初这是设置,以便表单将回发到配置文件控制器..类似于:
<% form_for profile_path(@user) do |f| %>
<% f.fields_for :settings_for_email do |s| %>
<% ... form fields ... %>
<% end %>
<% end %>
profile_controller的更新操作是这样的:
def update
@user = User.find(params[:id])
@user.settings_for_email.update_attributes(params[:user][:settings_for_email])
end
...
我不喜欢这个,因为它有一个漏洞,允许编辑的用户记录被更改...将其更改为@user = current_user,对我来说没有多大意义,因为它是一个需要更新的操作somekind的ID ..所以去/ profile / 123或profile / 456会产生相同的用户记录(因为它将使用current_user,params [:id]将是多余的)..这对我来说似乎很奇怪。
作为旁注,我需要一个控制器操作来将用户的电子邮件设置重置为默认值。
所以,我最终做的是制作一条新路线:
resource :settings_for_email, :only => :create do
post :reset, :on => :member
end
然后创建settings_for_email_controller:
#settings_for_email_controller.rb
def create
current_user.settings_for_email.update_attributes(params[:settings_for_email_controller])
redirect_to profile_url
end
def reset
current_user.reset_settings_for_email!
redirect_to profile_url
end
...
但后来我想知道,这可以以任何方式得到改善吗?
如果我真的想让这100%安息,那么最好是这样做:
#update_settings_for_email_controller:
def create
current_user.settings_for_email.update_attributes(params[:settings_for_email_controller])
redirect_to profile_url
end
#reset_settings_for_email_controller:
def create
current_user.reset_settings_for_email!
redirect_to profile_url
end
我对此有所了解,因为拥有两个控制器似乎有点傻。但我想不出更好的方法。同样,使用更新需要一个id,所以毁灭。我原本以为使用destroy动作来执行“重置”会很好,但是 - 再次......它会涉及一个浪费的id参数。所以我想我会问你们这些人的想法是什么?
答案 0 :(得分:0)
我认为你有点混淆:这里有两个用户。用户的详细信息需要更改,然后是实际更改的用户。通常,它们将是同一个但不总是,例如:管理员可能需要重置某些用户的密码。
正在更改的用户记录的id应该进入REST界面,而User.find params[:id]
应该正好处理它。
进行更改的用户与身份验证(确保此用户是她声称的用户)和授权(允许进行更改的用户?)有关。这是您在致电current_user
时获得的用户。像devise这样的宝石有助于此。
通常,您的控制器操作应该获得current_user
和目标用户,确保当前用户有权对目标用户执行操作(因为他们是同一个用户,当前用户是管理员或您在应用程序中拥有的任何其他逻辑,然后才执行该操作。