如何将param从1个控制器传递给另一个控制器

时间:2013-06-28 18:44:20

标签: ruby ruby-on-rails-3

我想在Client控制器视图中从以下链接传递param 哈希是@client,我想传递@ client.user_id,如果我把(:id => @ client.user_id)我不能在另一个控制器中获取get:id我要通过这个参数。我该怎么办 ?有没有办法做到这一点?(两个控制器是Client和Estate,我想将param从Client视图传递给Estate controllers create方法。这里没有资源嵌套!)

<%= link_to "New Property", new_estate_path(:key => @client.first.user_id) %>

创建行动

def create
    # @estate = Estate.new(params[:estate])
    if current_user.Company.nil?
      @estate = current_user.estates.build(params[:estate])
    else
      serve = User.find(params[:key])
      debugger
      @estate = serve.estates.build(params[:estate])
      #@estate.user_id = user_id
      debugger
    end

    respond_to do |format|
      if @estate.save
        if @estate.Mgmt.nil?
          EstateMailer.company_confirmation(@estate).deliver
        end
        format.html { redirect_to @estate, notice: 'Estate was successfully created.' }
        format.json { render json: @estate, status: :created, location: @estate }
      else
        format.html { render action: "new" }
        format.json { render json: @estate.errors, status: :unprocessable_entity }
      end
    end
  end

3 个答案:

答案 0 :(得分:1)

您在此处粘贴的代码应该有效:

<%= link_to "New Property", new_estate_path(:id => @client.user_id) %>

我认为问题是,您期望create方法中的参数,但它实际上是new方法。

如果您正在寻找create方法。你可以做到

<%= link_to "New Property", estates_path(:id => @client.user_id), :method => :post %>

但这不是用于POST行动的正确方法。正确的解决方案是使用button_to

<%= button_to "New Property", estates_path(:id => @client.user_id), :method => :post %>

link_to默认为GETbutton_to默认为POST,因为这些是他们的主要用法。如果您希望他们执行除默认操作之外的其他操作,则可以覆盖:method

答案 1 :(得分:0)

只需这样做

<%= link_to "New Property", new_estate_path(user_id: @client.user_id) %>

在您的控制器中:

params[:user_id]

您的问题是create操作是POST而不是GETlink_to只允许GET次操作。

答案 2 :(得分:0)

我在所有操作之外的控制器中创建了类变量。 @@ key,并在新的操作中分配了@@ key,来自params的user_id,以及create action中的这个@@ key。我不知道它是否是正确的方法。但它就像一个魅力!