好吧,我是Rails的新手,一般情况下我没有太多的编码经验,所以这听起来很愚蠢,但我的问题是:
我编辑了代码,下面是我当前状态的更新,包括更多信息:
投票及选择模式:
class Voting < ApplicationRecord
has_many :options
validates :vote, presence: true
accepts_nested_attributes_for :options
end
class Option < ApplicationRecord
belongs_to :voting
endroutes.rb:
Rails.application.routes.draw do
resources :votings do
resources :options
end
root 'votings#new'
end投票/new.html.erb:
<h1>create new poll</h1>
<%= form_with scope: :voting, url: votings_path, local: true do |form| %>
<p>
<%= form.label :voting %><br>
<%= form.text_area :content %>
</p>
<p>
<%= form.fields_for :option do |option| %>
<%= option.label 'Optionen' %><br>
<%= option.text_field :vote %>
<% end %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>投票/展示..:
<p>
<strong>Your Voting:</strong>
<%= @voting.content %>
</p>
<ul>
<p>
<%= @options.vote %>
</p>
</ul>votings_controller.rb:
class VotingsController < ApplicationController
def show
@voting = Voting.find(params[:id])
@options = @voting.options
end
def new
@voting = Voting.new
@voting.options.build
end
def create
@voting = Voting.new(voting_params)
@voting.save
redirect_to @voting
end
private
def voting_params
params.require(:voting).permit(:content, options_attributes: [:id, :vote])
end
endoptions_controller.rb:
class OptionsController < ApplicationController
def create
@voting = Voting.find(params[:id])
@options = @voting.options.create(option_params)
redirect_to voting_path(@voting)
end
private
def option_params
params.require(:option).permit(:vote)
end
end(我认为选项控制器中的一些代码与投票控制器加倍,我甚至不确定是否需要它)。
因此,我想在同一个页面中创建一个与其相关的选项的投票,然后在相同的页面上显示其选项的投票( voting /new.html.erb & voting /how.html.erb)。
这是我当前的错误消息:
NoMethodError in VotingsController#create 未定义的#投票方法“`vote”:0x0000000be55208
(这将在提交表单内容后显示。)因此,到目前为止,表单new.html.erb工作得很好。
他似乎不知道该怎么做
<%= @options.vote %>来自show.html.erb
我希望进一步的信息将有助于解决这一问题。
发布于 2017-11-29 17:59:39
你的问题在细节上有点缺乏,所以我只想指出一些显而易见的问题,并希望它能有所帮助。
您的投票控制器显示动作使用足智多谋的应用程序所期望的投票对象ID来查找选项对象。
class VotingsController < ApplicationController
def show
@option = Option.find(params[:id]) # In a resource route this is a voting id!
@voting = @option.user # what is option.user? Should be option.voting?
end这假设您的路由文件定义了resources :votings?
发布于 2017-11-29 18:12:03
我可以用简单的答案来解释你的问题,希望它能帮助你排除你的疑虑。
def create
@voting = Voting.new(voting_params)
@voting.save
redirect_to @voting
end在这个操作中,在创建@voting之后,它被重定向到show操作,作为redirect_to @voting,这将创建一个链接
/voting/:id在显示动作中,我们发送的是投票的id,所以在show操作中,很清楚,当我们试图获得params[:id]时,它将是表决的id,而不是选项的id --基本上应该在这里
def show
@voting = Voting.find(params[:id])
@options = @voting.options
end希望它能帮助你调试你的疑点,我不知道你什么,让我知道进一步的指导。谢谢
发布于 2017-11-29 19:10:13
我假设你是在尝试用它的选项来显示投票模型。
所以RESTful网址是/voting/<voting_id>。如果选项包含在routes.rb中作为嵌套资源用于投票,则为了显示特定选项,它是/voting/<voting_id>/options/<option_id>
例如,在localhost:3000/voting/1/options/20中
1是投票的id,20是选项的id。
因此,您需要将显示方法更改为:
def show
@voting = Voting.find(params[:id])
@options = @voting.options # Here it fetches all options for voting of the id passed
end我还建议将voting_params方法修改为:
def vote_params
params.require(:voting).permit(:content, options_attributes: [:id, :vote])
end由于一次投票有多个选项,所以需要白名单每个选项的id,否则它会覆盖。您可以在此这里上阅读更多内容。
您所拥有的模型关联非常类似于导轨中的示例。先读一读,然后重新使用代码。
编辑:
我建议现在使用form_for(在rails 5中是软推荐的)而不是form_with来工作。您的投票/new.html.erb如下所示:
<h1>create new poll</h1>
<%= <%= form_for @voting do |form| %> %>
<p>
<%= form.label :voting %><br>
<%= form.text_area :content %>
</p>
<p>
<%= form.fields_for :option do |option| %>
<%= option.label 'Optionen' %><br>
<%= option.text_field :vote %>
<% end %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>像这样使用form_with并不适用于我,因为form_with不支持自动生成ids。但是要坚持重构,直到rails 5.2版本和form_for可以被form_with所取代。这是这个rails提交的推论
https://stackoverflow.com/questions/47556587
复制相似问题