2016-08-14 29 views
0

我想写改变轮班来预订的方法更新实例与另一个实例的PARAMS。但是我得到的错误如何从一个视图

“未定义的方法'书”的#<轮班:0xc973ce0>”

,我不明白为什么。我只是希望它是一个按钮,而不是一个单独的编辑视图。

编号:原来我把书的方法放在错误的地方,但work_shifts.rb中的同一个方法抛出一个“未定义的方法`to_model为true:TrueClass”。我(显然)不确定什么是调用自定义方法的正确方法,该方法使用视图中的另一个参数更新一个对象。

我的索引视图:

<% @work_shifts.each do |work_shift| %> 
     <tr> 
     <td><%= work_shift.date %></td> 
     <td><%= work_shift.booked_by %></td> 
     <td><%= work_shift.booked %></td> 
     <td><%= work_shift.start_time.strftime("%H:%M") %></td> 
     <td><%= work_shift.stop_time.strftime("%H:%M") %></td> 
     <td><%= button_to 'Book', work_shift.book(current_member) %></td> 
     <% if current_member.admin? %> 
      <td><%= link_to 'Edit', edit_work_shift_path(work_shift) %></td> 
      <td><%= button_to "Ta bort", work_shift, :method=>:delete, :work_shift=>:destroy %></td> 
     <% end %> 
     </tr> 
    <% end %> 

WorkShift.rb:

def book(member_id) 
    self.update(booked:true, booked_by: member_id) 
end 

的routes.rb

resources :work_shifts do 
    member do 
     get 'book' 
    end 
end 

我是新来的导轨和学习在旅途中,我猜猜这个解决方案是微不足道的,但我找不到任何有助于我想做的问题或文档。

+1

您已经在控制器中定义了一个方法,但正试图在模型实例上调用它。 –

+0

谢谢,这有帮助!我不确定在哪里放置该方法。但是,如果我把这个方法放在模型中,我会得到“未定义的方法'to_model'为true:TrueClass”。任何有关导致该问题的提示? – SKR

+0

不与零上下文,没有。 –

回答

1

由于您试图修改资源的单个字段,因此book链接应该是PATCH请求,而不是GET

你的路线更改为

resources :work_shifts do 
    member do 
    patch 'book/:member_id' => 'work_shifts#book', as: 'book' 
    end 
end 

,这将产生以下路由

book_work_shift PATCH /work_shifts/:id/book/:member_id(.:format) workshifts#book 

和更新您的book行动

def book 
    @work_shift = WorkShift.find(params[:id]) 
    @work_shift.book(params[:member_id]) 
    # redirect to some view 
end 

,并相应修改模型方法。

def book(member_id) 
    self.update(booked:true, booked_by: member_id) 
end 

并替换

<%= button_to 'Book', work_shift.book(current_member) %> 

的视图的链接(你可以样式它,如果你想要一个按钮)

<%= link_to 'Book', book_work_shift_path(work_shift, current_member.member_id), method: :patch %> 

完蛋了!

+0

感谢您花时间回答!你的解决方案可能是完美的,但我遇到了另一个问题,我的成员表中有一个名为member_id的列,相当于我的应用中的用户名,这与路由冲突,采用“用户名”而不是自动分配的内部ID。我可以解决这个问题吗?或者我必须在应用程序中更改列名称吗? – SKR

+0

获得一个无路由匹配[GET]“/work_shifts/[work_shift.id]/book/[member ID]” – SKR

+0

没关系,我改变了我的routes.rb为“资源:work_shifts做 \t成员做 \t补丁” book /'=>'work_shifts#book',as:'book' \t end \t end \t get'work_shifts /:id/book'=>'work_shifts#book'' – SKR

相关问题