【问题标题】:Access to a param in another controller sended by render :template访问由渲染发送的另一个控制器中的参数:模板
【发布时间】:2017-02-01 23:58:33
【问题描述】:

所以我将一个参数从一个视图发送到另一个控制器的视图

<%= render template: 'dishes/new', :id => @restaurant.id %>

这是我的另一个控制器视图:

  def new
    @dish = Dish.new
     @id = params[:id]
  end

  def create
    @dish = Dish.new(dish_params)

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

private
  def dish_params
    params.require(:dish).permit( :avatar, :name, :description, [:id])
  end

这是我对表单的看法:

#new.html.erb
<h1>Add a new dish</h1>

<%= render 'dishes/dish_form' %>

然后是表格:

<%= form_for @dish, :url => { :controller => "dishes", action_name => "create" } do |f| %>
  <div class="field">
    <%= f.label :dish_name %>
    <%= f.text_field :name %>
  </div>
   <div class="field">
    <%= f.label :description %>
    <%= f.text_field :description %>
  </div>
  <div class="field">
    <%= f.label :image %>
    <%= f.file_field :avatar %>
  </div>
  <div class="actions">
    <%= f.submit 'Add new dish' %>
  </div>
<% end %>

但是当我尝试保存它时,我得到了这个错误:

【问题讨论】:

  • action show 在你的控制器中不存在
  • 是的,我知道我稍后会解决这个问题,问题是进入那里,因为没有餐厅 ID
  • 您在 create 操作中调用 @restaurant,但未定义 @restaurant
  • 你没有得到我的问题:/,我意识到这个问题但现在不是我的问题,它缺少我在渲染中发送的 id
  • 您能告诉我们,您在哪里定义了一个@restaurant 变量,以便在create 操作上调用@restaurant

标签: ruby-on-rails ruby controller render


【解决方案1】:

我认为当您期望您的 render template: 'dishes/new' 访问您的 DishesController 时,您的问题就出现了。这不是您调用渲染时发生的情况。

您正在做的是告诉 Rails 将 'dishes/new' 的模板加载到您的当前视图中,并且您正在传递 'dishes/new' 一个它可以在渲染时访问的变量。您没有向控制器发送参数。

如果您想保持当前的设置,您可以通过一些调整使其工作。

我将假设您的 Dish 模型属于 Restaurant,因此将 restaurant_id 作为列。如果这是真的,那么您可以在您的菜肴表单中添加一个隐藏字段,称为 restaurant_id,并在您的控制器中更新您允许的参数以允许在菜肴上设置餐厅 ID。

您的表单将如下所示:

<%= form_for @dish, :url => { :controller => "dishes", action_name => "create" } do |f| %>
  <%= f.hidden_field :restaurant_id, value: id %>
  ...
<% end %>

您的控制器中允许的参数如下所示:

def dish_params
  params.require(:dish).permit(:avatar, :name, :description, :restaurant_id)
end

您可以获取有关 rails 渲染如何工作的更多信息here

【讨论】:

  • 这就是我的工作和工作!但我使用这条线&lt;%= f.hidden_field :restaurant_id, value: params[id] %&gt; 因为我已经得到了参数,我尝试将@id = params[:id] 放在Dishes 的创建控制器中并使用&lt;%= f.hidden_field :restaurant_id, value: @id %&gt; 但没有用,它只适用于第一个
【解决方案2】:

错误是您的名为 Restaurants 的控制器没有名为“Show”的操作。

一种解决方案是将名称为“Show”的 Action 添加到餐厅控制器。

另一个选项可能是您实际创建了您想要的操作,但您将其命名为“显示”以外的其他名称。

【讨论】:

  • 是的,但它进入 else 因为它没有检测到我在渲染中发送的餐厅 ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
相关资源
最近更新 更多