【问题标题】:Setting an object attribute from a hidden field Ruby on Rails从隐藏字段 Ruby on Rails 设置对象属性
【发布时间】:2015-06-18 20:00:27
【问题描述】:

我正在尝试通过隐藏的表单字段更新Idea 属性challenge_id。这是字段:

<%= f.hidden_field :challenge_id, :value => @challenge.id %>

当创意被创建到创意控制器#create 方法时,它成功地将挑战 ID 作为参数传递:

Started POST "/ideas.js" for ::1 at 2015-06-18 15:39:49 -0400 Processing by IdeasController#create as JS Parameters: {"utf8"=>"✓", "idea"=>{"title"=>"adsf", "description"=>"asf", "domain_tokens"=>"20", "challenge_id"=>"5"}, "commit"=>"Create Idea"}

这个challenge_id => 5 应该保存到下面@idea = Idea.new(idea_params) 行中的想法:

ideas_controller.rb

def create
    @idea = Idea.new(idea_params)

    respond_to do |format|
      if @idea.save
        idea_count = @idea.user.ideas_created_count
        @idea.user.update(:ideas_created_count => idea_count + 1)
        @idea.domains.each do |domain|
          current_user.add_points(1, category: domain.title)
        end
        @ideas = current_user.current_team.ideas.sort_by{|i| i.heat_index}.reverse
        @ideas = @ideas.paginate(:page => params[:ideas_page], :per_page => 10)
        format.html { redirect_to :back, notice: 'Idea was successfully created.' }
        format.json { render :show, status: :created, location: @idea }
        format.js
      else
        format.html { redirect_to :back, notice: "You must attach domains to your Idea." }
        format.json { render json: @idea.errors, status: :unprocessable_entity }
        format.js { render :create_failed }
      end
    end
  end
  .
  .
  def idea_params
   params.require(:idea).permit(:title, :description, :challenge_id)
  end

但是,此挑战 ID 不会与其他允许的 idea_params:title:description 一起保存到 idea。如何在创建时将 challenge_id 保存到 Idea?

【问题讨论】:

  • 这个方法的第一行中的puts params会打印什么?
  • 还有 idea_params 返回的内容。

标签: ruby-on-rails ruby forms ruby-on-rails-4


【解决方案1】:

为什么不在表单中传递challenge_id,而不是使用隐藏字段?否则,您将允许用户在该隐藏字段中输入他们想要的任何内容。

表格:

form_for [@challenge, Idea.new] do |f|

然后:

def create
    @challenge = Challenge.find(params[:challenge_id])
    @idea = Idea.new(idea_params)
    @idea.challenge_id = @challenge.id
end

【讨论】:

    【解决方案2】:

    我假设您在想法表中有 challenge_id 列。

    尝试类似:

    def create
        @idea = Idea.new(idea_params)
        @idea.challenge_id = params[:idea][:challenge_id]
         #...
     end
    

    如果您要保存的参数或列不同,请确保进行更改,但您明白了。

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2012-05-12
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多