将当前服务名称和ID保存到服务预订模型

时间:2013-11-12 23:16:00

标签: ruby-on-rails ruby ruby-on-rails-3 devise ruby-on-rails-4

我想知道是否有人可以指出我正确的方向。我有服务和服务预订模型。我的服务预订表包含字段:id,service_name,service_id,date,time和user_id。我的服务视图页面上有一个“预订服务”链接,在保存预订时,我想将当前服务名称和ID保存到servicebookings表和当前用户ID。

下面是我的服务控制器创建操作,但我不知道如何去做,我知道我需要访问服务ID和名称参数可能通过隐藏字段等,可以在这里有任何帮助吗?谢谢你的帮助。

服务有很多服务预订,用户有很多服务和服务预订。 服务和服务预订属于用户。

def create
    @servicebooking = current_user.servicebookings.build(params[:servicebooking].permit(:service_id, :date, :time, :user_id))
    @servicebooking = //Need some help here

    if @servicebooking.save
      redirect_to @servicebooking
    else
      render 'new'
    end
  end

//////编辑 - 我的服务显示视图

<h2><%= @service.name %></h2><%= link_to 'Book this service', new_servicebooking_path %>

<p>
  <strong>Name:</strong>
  <%= @service.name %>
</p>

<p>
  <strong>Date Available:</strong>
  <%= @service.date_available %>
</p>

<p>
  <strong>Time Available:</strong>
  <%= @service.time_available %>
</p>

////// EDIT2我的服务编辑视图

<%= form_for @servicebooking, :html => {  :multipart => true } do |f| %>
  <% if @servicebooking.errors.any? %>
  <div id="errorExplanation">
    <h2><%= pluralize(@servicebooking.errors.count, "error") %> prohibited
      this service booking from being saved:</h2>
    <ul>
    <% @servicebooking.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
  <% end %>



  <p>
    <%= f.label :date %><br>
    <%= f.text_area :date %>
  </p>

  <p>
    <%= f.label :time %><br>
    <%= f.text_area :time %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

1 个答案:

答案 0 :(得分:1)

您没有显示您的观点,因此要向您推荐如何传递hidden_​​field(如

)并不容易
#somewhere in form 
<%= hidden_field_tag 'servicebooking[service_id]', @service.try(:id)  %>
<%= hidden_field_tag 'servicebooking[service_name]', @service.try(:name)  %>

所以我可以提出另一种方法 - 在Servicebooking模型中挂钩after_validation

 belongs_to :service #i hope you have this row?
 #...
 after_validation :set_service_name

 def set_service_name
  self.service_name = service.try(:name)
 end

service_id可以(必须)通过belongs_to关联设置,或者您可以将其添加到上面的方法

<强>更新

假设您拥有Service模型

has_many :servicebookings 
从服务秀视图

1,您需要通过:service_id

传递new_servicebooking_path param
<%= link_to 'Book this service', new_servicebooking_path(service_id: @service.id) %>

2在控制器的@service方法中定义new变量

 def new
   @service = Service.find(params[:service_id])
   @servicebooking = @service.servicebookings.new
 end

3插入编辑表单这两行

<%= f.hidden_field :service_name, @service.try(:name)  %>
<%= f.hidden_field :user_id, current_user.try(:id)  %>

或者你甚至可以在控制器级别(方法新)中传递@service.namecurrent_user.id而不进行任何形式修改

@servicebooking = @service.servicebookings.new(service_name: @service.try(:name), user_id: current_user.try(:id))