用于编辑/更新单个模型属性的路由

时间:2014-09-19 19:50:57

标签: ruby-on-rails routing nested-attributes

我有一个User模型和一个ProfileQuestionnaire模型。用户has_one ProfileQuestionnaire,每个ProfileQuestionnaire有五个问题(用户已回答)作为属性。

用户#edit动作显示用户已回答的五个ProfileQuestionnaire问题的集合。我的问题是:假设每个问题在这个用户#edit视图旁边都有一个“编辑”按钮,我该如何修改我的路线(如下所示),使这个“编辑”按钮能够指导用户专门针对特定问题进行编辑和更新的操作?也就是说,一次一个地编辑/更新ProfileQuestionnaire模型上的特定属性?

  resources :users do
    resources :profile_questionnaires
  end

1 个答案:

答案 0 :(得分:1)

Nested Resources

你这样做:

#config/routes.rb
resources :users do 
   resources :profile_questionnaires #-> domain.com/users/:user_id/profile_questionnaires/:id
end

#app/views/users/show.html.erb
<% @user.profile_questionnaires.each do |question| %>
   <%= link_to question.name, user_profile_questionnaire_path(@user, question), method: :put %>
<% end %>

这将带您进入profile_questionnaires#edit行动,然后您必须与自己合作:

#app/controllers/profiles_questionnaires_controller.rb
class ProfilesQuestionnairesController < ApplicationController
   def edit
      @user = User.find params[:user_id] if params[:user_id].present?
      @profile_questionnaire = ProfileQuestionnaire.find params[:id]
   end
end

<强>属性

为了更改ProfileQuestionnaire模型中的特定属性,您需要记住在Rails中没有内置的方法来实现这一点 - 您只需要能够创建一个带有那里的单一属性。

由于缺乏上下文,我不得不假设你想手动更改属性。我亲自做的就是将它全部保存在edit视图中,并使用一些条件语句来确定是否要显示:

#app/views/profiles_questionnaires/edit.html.erb
<%= form_for [@user, @profile_questionnaire] do |f| %>
   <% %w(your params here).each do |param| %>
      <%= f.text_field param.to_s if @type.include?(param.to_s) %>
   <% end %>
   <%= f.submit %>
<% end %>
  
      
  • 您的控制器并不关心发送哪些参数
  •   
  • 您可以规定要显示/编辑的属性
  •   
  • 它使您能够扩展功能
  •   

以下是您管理控制器的方式:

#app/controllers/profiles_questionnaires_controller.rb
class ProfilesQuestionnairesController < ApplicationController
   def edit
      @user = User.find [:user_id]
      @profile_questionnaire = ProfileQuestionnaire.find params[:id]

      @type = params[:type] if params[:type].present?
      @type ||= ProfileQuestionnaire.column_names
   end
end

然后您可以将以下链接发送到控制器:

<%= link_to "x", user_profiles_questionnaire_path(@user, "4", type: "param_1" %>
相关问题