宁静设计的建议?

时间:2011-08-18 05:54:10

标签: ruby-on-rails ruby ruby-on-rails-3 rest architecture

关于为我正在处理的应用的特定部分构建一个宁静设计的最佳方法,我有一个问题。

应用程序的一些背景知识:

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参数。所以我想我会问你们这些人的想法是什么?

1 个答案:

答案 0 :(得分:0)

我认为你有点混淆:这里有两个用户。用户的详细信息需要更改,然后是实际更改的用户。通常,它们将是同一个但不总是,例如:管理员可能需要重置某些用户的密码。

正在更改的用户记录的id应该进入REST界面,而User.find params[:id]应该正好处理它。

进行更改的用户与身份验证(确保此用户是她声称的用户)和授权(允许进行更改的用户?)有关。这是您在致电current_user时获得的用户。像devise这样的宝石有助于此。

通常,您的控制器操作应该获得current_user和目标用户,确保当前用户有权对目标用户执行操作(因为他们是同一个用户,当前用户是管理员或您在应用程序中拥有的任何其他逻辑,然后才执行该操作。