将参数传递给Rails中的新控制器操作

时间:2016-02-26 17:59:55

标签: ruby-on-rails

我想调用控制器的新操作来使用现有对象创建新对象来设置默认值。到目前为止,我尝试过这样做:

item

在Wice网格表中,/item/new.10:id的实例。

生成的路线是request.referrer,其中10是我想要用作默认项目的{{1}}。我可以通过{{1}}了解它,但我想知道是否有更好/更清洁的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

如果要在新对象上设置默认值,则应考虑在迁移期间在数据库级别设置这些默认值。为了使您的系统保持RESTful,您应该保持“新”操作URL独立于您正在获取默认值的对象,即/ item / new。

如果要在不应用数据库级别的情况下设置现有对象的默认值,则应考虑在控制器操作中创建实例变量,并在视图中使用该变量在表单元素中设置默认值。另一种选择是在模型中的before_create回调中编辑对象并在那里设置字段。改变你的路线以适应这个想法将是糟糕的设计IMO。

将id作为参数传递给控制器​​:

link_to "New Item Path", new_item_path(:default_item_id => item.id)
控制器中的

   @default_item = Item.find(params[:default_item_id])

答案 1 :(得分:1)

request.referrer?您应该能够通过params

获取控制器中的ID

不确定是否存在问题,但“新建”和路径规范之间应该有逗号

link_to 'New', new_item_path(t)

然后在控制器中你可以设置强大的参数,如果你想彻底

ItemsController < ApplicationController
  def new
    # new action
  end

  def create
    item = Item.new(item_params)

    if item.save
      flash[:notice] = 'Successfully created your item.'
      redirect_to item #if there's an item#show page
    else
      flash[:alert] = 'Error: item not created.'
      render :new
    end
  end

  private

  def item_params
    params.require(:item).permit(:attribute_1, :attribute_2, ...)
  end
end

希望这有帮助