【问题标题】:Link_to create with parameter before - ForbiddenAttributesError nowLink_to create with parameter before - ForbiddenAttributesError now
【发布时间】:2014-06-12 17:37:25
【问题描述】:

我想要什么:

我需要一个按钮或一个链接(没关系)到 Reservationcreate 操作 控制器并给它一个参数。

并解决现在给我的 ForbiddenAttributesError。

这是我的模型和控制器:

预留模式

class Reservation < ActiveRecord::Base
    belongs_to :user
    belongs_to :dinner
end

预订控制器

class ReservationsController < ApplicationController
  load_and_authorize_resource

  def show
    @reservations = Reservation.joins(:user).where('dinner_id' => params[:dinner_id]).select("users.*,reservations.*")
    @dinnerid = params[:dinner_id]

    respond_to do |format|
      format.html
      format.json { render :json => @reservations }
    end
  end

def create
@reservation = Reservation.new(params[:reservation])
@reservation.user_id = current_user.id

respond_to do |format|
      if @reservation.save
        format.html { redirect_to @reservation, notice: 'Reservation was successfully created.' }
        format.json { render :show, status: :created, location: @reservation }
      else
        format.html { render :show }
        format.json { render json: @reservation.errors, status: :unprocessable_entity }
      end
    end
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def reservation_params
    params.require(:reservation).permit(:dinner_id)
  end

end

编辑:根据@Rahul Singh 的建议,这是我的实际代码,但存在相对错误:

    <p id="notice"><%= notice %></p>

<table>
  <thead>
  <tr>
    <th>Id</th>
    <th>User id</th>
    <th>Dinner id</th>
    <th>User email</th>
    <th>User name</th>
  </tr>
  </thead>

  <tbody>
  <% @reservations.each do |reservation| %>
      <tr>
        <td><%= reservation.id %></td>
        <td><%= reservation.user_id %></td>
        <td><%= reservation.dinner_id %></td>
        <td><%= reservation.user.email %></td>
        <td><%= reservation.user.name %></td>
      </tr>
  <% end %>
  </tbody>
</table>

<br/>TRY 00a <br/>
<%= form_for(Reservation.new) do |f| %>
    <%= f.hidden_field( :dinner_id, :value => @dinnerid.to_s) %>
    <%= f.submit "Join1" %>
<% end %>
<br/> !!!!!!!!!!ERROR : ActiveModel::ForbiddenAttributesError

<br/>TRY 00b <br/>
<%= link_to "Join1", reservations_path(dinner_id:@dinnerid.to_s), method: :post %>
<br/> !!!!!!!!!!ERROR : param is missing or the value is empty: reservation

我提供了错误的截图:

表单错误:https://www.dropbox.com/s/i2x1m520ptqdj56/createReservationForm.jpg

link_to 错误:https://www.dropbox.com/s/8xjwee5oo7q6uhk/createReservationLink_to.jpg

【问题讨论】:

标签: ruby-on-rails ruby forms ruby-on-rails-4 link-to


【解决方案1】:

这应该可行

<%= form_for(Reservation.new) do |f| %>
    <%= f.hidden_field( :dinner_id, :value => @dinnerid.to_s) %>
    <%= f.submit "Join1" %>
<% end %>

点击 Join1 按钮将提交表单到 ReservationsController 创建操作。

通过链接试试这个

<%= link_to "Join1", reservations_path(dinner_id:@dinnerid.to_s), method: :post %>

为使上述工作,请在您的 routes.rb 中添加以下内容

resources :reservations

【讨论】:

  • error: "undefined method `reservations_path' for #:0x0000000361abb8>" 这是否意味着我必须在路由中定义?怎么样?
  • 解决此问题的禁止属性错误参见stackoverflow.com/questions/21835230/…
  • google for rails4 strongs 参数,或批量赋值,或禁止属性错误。
  • 正如您在控制器中看到的那样,我已经拥有其他问题中描述的 areservation_params 方法:)
【解决方案2】:

更改这一行 -> @reservation = Reservation.new(params[:reservation])

对此 -> @reservation = Reservation.new reservation_params

然后再试一次;)。

【讨论】:

  • 这并评论 CanCan gem 的 load_and_autorize 我可以添加预订,但在新记录中我获得的晚餐 ID 为空。所以我认为我只是不使用参数
【解决方案3】:

我想知道将您的预订路线作为晚餐的嵌套资源是否会更好。

似乎没有晚餐就无法预订,所以我会这样明确表示:

# config/routes.rb resources :dinners do resources :reservations end

运行rake routes 看看这将如何改变路线。

您现在可以传递晚餐 ID:

# app/views/dinners/show.html.erb <%= button_to 'Reserve this dinner', dinner_reservations_path(@dinner) %>

按钮将路由到创建操作,因为按钮的默认 HTTP 方法是 POST。

# app/controllers/reservations_controller.rb
class ReservationsController < ApplicationController
  before_action :set_dinner

  def create
    @dinner.reservations.create! user: current_user
    # would render reservations/create.html.erb
  end

  private
    def set_dinner
      @dinner = Dinner.find(params[:id])
    end
end

这并不能解决您让该链接正常工作的直接问题。但我认为你会更好地构建你的应用程序,更像上面的那样。

完全披露:提出这个问题的人在推特上亲自联系了我,所以我冒昧地用更一般的设计建议来回答这个问题。

【讨论】:

    【解决方案4】:

    我不确定这是不是“最好”的方法,但我认为它是最简单的方法。

    你可以用字符串插值做一些事情:

    a href="/reservations?dinner=#{dinner.id}" Join
    

    那么你可以得到参数

    params[:dinner]
    

    【讨论】:

    • 我改变了我的控制器中的参数,因为我发现你是对的。相反,我无法理解您的链接。你的意思是我应该添加一个手动链接并添加适当的 routes.rb 规则吗?
    • 我认为这种方法有效,但它有点不正统(对我来说)。您无需在路由中指定任何特殊内容,因为您只是在 URL 中附加参数。虽然它可能不是最好的“Rails 方式”,但这应该可以正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2013-11-20
    • 2011-06-08
    • 2011-04-13
    相关资源
    最近更新 更多