访问另一个控制器中由 render :template 发送的参数
Access to a param in another controller sended by render :template
所以我将一个参数从一个视图发送到另一个控制器的视图
<%= 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 %>
但是当我尝试保存它时出现了这个错误:
错误是说您名为 Restaurants 的控制器没有名为 "Show" 的操作。
一种解决方案是将名称为 "Show" 的操作添加到餐厅控制器。
另一个选项可能是您实际上创建了您想要的操作,但您将其命名为 "Show" 以外的名称。
我认为当您期望您的 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
所以我将一个参数从一个视图发送到另一个控制器的视图
<%= 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 %>
但是当我尝试保存它时出现了这个错误:
错误是说您名为 Restaurants 的控制器没有名为 "Show" 的操作。
一种解决方案是将名称为 "Show" 的操作添加到餐厅控制器。
另一个选项可能是您实际上创建了您想要的操作,但您将其命名为 "Show" 以外的名称。
我认为当您期望您的 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