Ruby on Rails自定义更新操作

时间:2014-07-23 10:58:26

标签: ruby-on-rails triggers custom-action

我想更新member_id,触发更新:location_stock。

我已经有了这些自定义操作 的 costumes_and_cost_records_controller.rb

def rent
    @costumes_and_cost_record = CostumesAndCostRecord.find(params[:costumes_and_cost_record_id])
end

def rent_method
    @costumes_and_cost_record = CostumesAndCostRecord.find(params[:costumes_and_cost_record_id])
    @costumes_and_cost_record.update_attributes(:member_id => params.permit(:member_id), :location_stock => true)

    redirect_to @costumes_and_cost_record
end

我在视图中使用了简单的表单 rent.html.erb

<%= simple_form_for @costumes_and_cost_record do |f| %>
    <%= f.association :member, :label => "Member", label_method: :to_s, value_method: :member_id, include_blank: true %>

    <%= f.submit "Rent", :controller => :costumes_and_cost_records, :action => :rent_method, :method => :put, :member_id => :member %> <%# updates only member_id, doesnt update :location_stock %>
    <%# link_to "Rent", :controller => :costumes_and_cost_records, :action => :rent_method, :method => :put, :member_id => :member_id %> <%# updates :location_stock, sets member_id = NULL %>
<% end %>

现在如果我使用提交按钮:member_id更新但控制器没有更新:location_stock。

如果我使用link_to :location_stock更新,但:member_id 设置为NULL。

我想更新这两个属性。我应该使用提交按钮或link_to以及如何解决此问题吗?

我设置了 routes.rb ,以便在视图中同时使用link_to和submit方法:

resources :costumes_and_cost_records do
    post 'show'
    get 'rent'
    get 'rent_method'
end

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要调用rent_method来更新member_id

  1. 路线变化 put 'rent_method'
  2. 查看更改

    <%= simple_form_for @costumes_and_cost_record, method: :put, url: [@costumes_and_cost_record, :rent_method] do |f| %>
      <%= f.association :member, :label => "Member", label_method: :to_s, value_method: :member_id, include_blank: true %>
    
      <%= f.submit "Rent" %> 
    <% end %>
    
  3. 控制器

    def rent_method
      @costumes_and_cost_record = CostumesAndCostRecord.find(params[:costumes_and_cost_record_id])
      @costumes_and_cost_record.update_attributes(:member_id => member_params[:member_id], :location_stock => true)
    
      redirect_to @costumes_and_cost_record
    end
    def member_params
      params.require(:costumes_and_cost_record).permit(:member_id)
    end 
    

答案 1 :(得分:0)

<强>路线

首先,如果您希望member_id出现,那么您最好使用nested routes,如下所示:

#config/routes.rb
resources :member do.
   resources :costumes_and_cost_records do
        ...  #-> domain.com/members/2/costumes_and_cost_records/
   end
end

这将为您提供链接中params[:member_id]所需的值:

<%= link_to "Member", member_costumes_and_cost_records_path(member_id) %>

<强>表格

在您的表单中,您需要能够正确定义url(Rails自然会提交给基于CRUD的操作,而不是自定义操作):

<%= simple_form_for @costumes_and_cost_record, url: your_rent_method_path, method: :patch do |f| %>

这将提交到rend_method路径,或您要求的任何自定义操作。

-

我个人会将您在控制器中的任何活动保持为单一操作 - 这将允许您将所有业务逻辑保留在一个操作中,这对于MVC programming pattern

是首选

答案 2 :(得分:0)

花了我3天但我终于解决了这个问题。 Ruslan Kyrychuk的答案很好,但问题是我没有遵循Rails命名惯例。我有外键:costumes_and_cost_records.member_id和主键:member.member_id所以我将member.member_id重命名为member.id并修复了问题。