Rails - 使用简单表单时传递变量

时间:2018-01-20 19:28:19

标签: ruby-on-rails ruby ruby-on-rails-5

使用简单表单创建新模型对象时,我需要将一个对象的id传递给新对象,因为它依赖于其URL的id。路由是:

resources :coins do
  resources :questions
end

我试图使用隐藏字段标记执行此操作,但它无法正常工作。 ID未传递,因此新对象不会保存。

<%= simple_form_for @question, url: coin_questions_path(@coin.id) do |f| %>
    <%= f.input :ques_num %>
    <%= f.input :content %>
    <%= hidden_field_tag(:coin_id, @coin.id) %>
    <%= f.button :submit, 'Submit' %>
<% end %>

在此之前,我使用简单形式的collection_select手动输入ID并且它有效,但我需要它自动发生。是否有更好的方法来做我想要的事情?

问题模型:

class QuestionsController < ApplicationController

  before_action :find_question, only: [:show, :edit, :update, :destroy ]
  before_action :find_coin
  before_action :authenticate_user!, except: [:index, :show]

  def index
    @questions = Question.where(coin_id: @coin.id).order("created_at DESC")
  end

  def show
  end

  def new
    @coin
    @question = current_user.questions.build
  end

    def create
      @question = current_user.questions.build(question_params)
      if @question.save
        redirect_to coin_question_path(@coin.id, @question.id)
      else
        render 'new'
      end
    end

  .
  .
  .

  private

    def find_question
        @question = Question.find(params[:id])
    end

    def find_coin
      @coin = Coin.find(params[:coin_id])
    end

    def question_params
        params.require(:question).permit(:content, :ques_num, :coin_id)
    end

end

2 个答案:

答案 0 :(得分:1)

您可以轻松地将hidden_field与值read more

一起使用

例如:

<%= f.hidden_field :coin_id, value: @coin.id %>

然后该值将在创建时的params[:question][:coin_id]中,因此其余部分应该像现在一样工作。 :)

答案 1 :(得分:0)

<%= hidden_field_tag(:coin_id, @coin.id) %>将生成一个名称为&#34; coin_id&#34 ;;的字段你想要&#34;问题[coin_id]&#34;

您应该将此值分配给控制器中的对象。 @question.coin_id = @coin.id,或@question = Question.new(:user => current_user, :coin => @coin)@question = current_user.questions.new(:coin => @coin)

<%= f.input :coin_id, :as => :hidden %>