我有一个可以在通常的rails编辑路径上编辑的用户模型。
但是,我想允许用户模型中的许多字段可以从根目录中编辑。
我已经尝试将以下代码放在索引页面中,除非其中一个字段存在验证错误,否则它会起作用。发生这种情况时,用户将被路由到通常的用户编辑路径。
如果用户从索引页面发送请求(但是保留它以便用户被路由回到编辑路径,如果那是在哪里),我该怎么改变这个以便用户被路由回索引(带有错误消息)他们正在编辑?
另外,感觉就像我正在攻击这个而不是以“最佳实践”方式进行 - 是否有更好的方法。
代码我已从编辑路径复制到索引页面:
<%= simple_form_for(current_user, :url => registration_path(current_user), :html => { :method => :put, :class => 'form-vertical ' }) do |f| %>
<%= f.error_notification %>
<%= display_base_errors current_user %>
<%= f.input :dry_fly, inline_label: 'I use dry flies', as: :boolean, label: false %>
<%= f.input :wet_fly, inline_label: 'I use wet flies', as: :boolean, label: false %>
<%= f.input :lure, inline_label: 'I use lures', as: :boolean, label: false %>
<%= f.input :still_water, inline_label: 'I fish lakes', as: :boolean, label: false %>
<%= f.input :river, inline_label: 'I fish rivers', as: :boolean, label: false %>
<%= f.input :current_password, :hint => "we need your current password to confirm your changes", :required => true %>
<%= f.button :submit, 'Update', :class => 'btn-primary' %>
<% end %>
RegistrationsController #update:
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)
if update_resource(resource, account_update_params)
yield resource if block_given?
if is_flashing_format?
flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ?
:update_needs_confirmation : :updated
set_flash_message :notice, flash_key
end
sign_in resource_name, resource, :bypass => true
respond_with resource, :location => after_update_path_for(resource)
else
clean_up_passwords resource
respond_with resource
end
end
看起来Kirti Thorat的回应是正确的方法 - 但我无法从设计控制器那里看到,如果验证失败,它会定义应该使用哪条路线?
答案 0 :(得分:0)
是的,这是可能的,但首先需要检查HTTP Referer,它将为您提供请求的来源,因此您可以在update
操作中呈现您的视图。例如:
如果更新失败,您可以通过检查引用来呈现相应的编辑用户路径 如下图所示
if URI(request.referer).path == edit_user_path
render :edit ### Specify appropriate action
else
render :index ### Specify appropriate action
end